丝路设计培训学校-专注CG行业人才培养

  • 24小时免费客服热线
  • 025-6965-8961

当前位置:丝路设计网>设计教程>游戏美术>unity>正文

Unity3D教程:如何用shader渲染游戏3D角色

2018-12-10 14:28 来源: 丝路设计培训 分类: unity
161 作者:丝路设计培训

[导读] Unity3D是一个跨平台的游戏引擎,本篇 Unity3D教程 主要介绍一下如何利用Shader来渲染游戏中的3D角色,以及如何利用Unity提供的Surface Shader来书写自定义Shader。 一、 从Shader开始 1、通过A

  Unity3D是一个跨平台的游戏引擎,本篇Unity3D教程主要介绍一下如何利用Shader来渲染游戏中的3D角色,以及如何利用Unity提供的Surface Shader来书写自定义Shader。

  一、 从Shader开始

  1、通过Assets->Create->Shader来创建一个默认的Shader,并取名“MyShader”。

shader渲染游戏3D角色,Unity3D教程

  2、将MyShader打开可看见Unity默认的Shader代码

  [csharp] view plaincopy

  Shader "Custom/MyShader" {

  Properties {

  _MainTex ("Base (RGB)", 2D) = "white" {}

  }

  SubShader {

  Tags { "RenderType"="Opaque" }

  LOD 200

  CGPROGRAM

  #pragma surface surf Lambert

  sampler2D _MainTex;

  struct Input {

  float2 uv_MainTex;

  };

  void surf (Input IN, inout SurfaceOutput o) {

  half4 c = tex2D (_MainTex, IN.uv_MainTex);

  o.Albedo = c.rgb;

  o.Alpha = c.a;

  }

  ENDCG

  }

  FallBack "Diffuse"

  }

  3、将该Shader赋予一个角色,就可以看到该Shader所能表达出的Diffuse渲染效果。

shader渲染游戏3D角色,Unity3D教程

  4、接下来我们将以此默认Shader作为蓝本,编写出自定义的Shader。

  二、 实现多种自定义渲染效果

  1、 BumpMap效果

  如果想实现Bump Map效果,可对上述的Shader做如下修改:

  1.1 在属性Properties中加入:

  [csharp] view plaincopy

  Properties {

  _MainTex ("Base (RGB)", 2D) = "white" {}

  _BumpMap("Bumpmap", 2D) = "bump" {}

  }

  1.2 在SubShader的变量中也进行相应修改:

  [csharp] view plaincopy

  sampler2D _MainTex;

  sampler2D _BumpMap;

  struct Input {

  float2 uv_MainTex;

  float2 uv_BumpMap;

  };

  1.3 最后修改surf函数,加入对Normal分量的计算:

  [csharp] view plaincopy

  void surf (Input IN, inout SurfaceOutput o) {

  half4 c = tex2D (_MainTex, IN.uv_MainTex);

  o.Albedo = c.rgb;

  o.Alpha = c.a;

  o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));

  }

  这样,角色的材质部分即可变为如下形式(暂定BumpMap的Shader名为“MyShader1”):

shader渲染游戏3D角色,Unity3D教程

  然后,根据Base图来创建其Normal Map图,并拖入到BumpMap中即可。BumpMap的效果显示如下:

shader渲染游戏3D角色,Unity3D教程

  2、 Blinn-Phong效果

  如果想实现Blinn-Phong效果,可对上述的Shader做如下修改:

  2.1 在属性Properties中加入:

  [csharp] view plaincopy

  _AmbientColor ("Ambient Color", Color) = (0.1, 0.1, 0.1, 1.0)

  _SpecularColor ("Specular Color", Color) = (0.12, 0.31, 0.47, 1.0)

  _Glossiness ("Gloss", Range(1.0,512.0)) = 80.0

  2.2 在SubShader的变量中也加入相应修改:

  [csharp] view plaincopy

  fixed4 _AmbientColor;

  fixed4 _SpecularColor;

  half _Glossiness;

  2.3 最后修改surf函数,进行如下修改:

  [csharp] view plaincopy

  fixed4 c = tex2D (_MainTex, IN.uv_MainTex);

  这里将原有的half4替换为fixed4,这样做是为了提高渲染的性能,因为fixed的精度较之half要低,更高的精度意味着更大的计算量,而这里fixed的精度已经足够,所以使用fixed替代half4,从而来降低计算消耗,增加渲染性能。

  2.4 将“#pragma surface surf Lamber”改成“#pragma surfacesurf CustomBlinnPhong”,同时加入与其对应的LightingCustomBlinnPhong函数来计算顶点光照。

  [csharp] view plaincopy

  inline fixed4 LightingCustomBlinnPhong (SurfaceOutput s, fixed3 lightDir, fixed3 viewDir, fixed atten)

  {

  fixed3 ambient = s.Albedo * _AmbientColor.rgb;

  fixed NdotL = saturate(dot (s.Normal, lightDir));

  fixed3 diffuse = s.Albedo * _LightColor0.rgb * NdotL;

  fixed3 h = normalize (lightDir + viewDir);

  float nh = saturate(dot (s.Normal, h));

  float specPower = pow (nh, _Glossiness);

  fixed3 specular = _LightColor0.rgb * specPower * _SpecularColor.rgb;

  fixed4 c;

  c.rgb = (ambient + diffuse + specular) * (atten * 2);

  c.a = s.Alpha + (_LightColor0.a * _SpecularColor.a * specPower * atten);

  return c;

  }

  该函数的名称为什么不是“CustomBlinnPhong”呢?这是因为该函数虽然是由“#pragma surface surf CustomBlinnPhong”来调用,但是为了让该函数可以正常工作,我们需要在其名称前加入“Lighting”关键字,这样Unity才能识别出这是一个自定义的光照函数。

  通过以上设置,角色的材质部分即可变为如下形式(暂定该Shader名为“MyShader2”):

shader渲染游戏3D角色,Unity3D教程

  其显示效果如下:

shader渲染游戏3D角色,Unity3D教程

  以上关于Unity 3D专业老师已经分享了人物的基本渲染方法和利用shader实现的几种效果,这里给出的都是相对应的操作方法,如果需要更深层次的了解与学习,可以选择丝路教育免费试学课程。

  Unity3D常见问题及解决方案

  一、问题:Unity如何动态载入外部模型等文件?

  答复:可以使用AssetBundle。

  二、问题:脚本编辑器有语法提示吗?

  答复:有的,Win版使用Ctrl+I,Mac版使用Ctrl+>。

  三、问题:如何使用烘焙贴图(多重纹理)?

  答复:不要使用Shell贴图,直接将烘焙图赋予贴图的"自发光"通道之上。

  四、问题:为什么水面没有实时反射效果?

  答复:只有专业版才支持这种反射效果。

  五、问题:怎么做摄像机漫游动画?

  答复:Max正常制作摄像机漫游动画,倒到Unity中后,将Unity的Camea拖拽到Max导出的摄像机Gameobject物体之上,作为其子物体即可。

  六、问题:如何自定义Webplayer载入Logo及进度条?

  答复:< param name="progressbarimage" value="进度条名" />,< param name="progressframeimage" value="进度条外框名" />。

  七、问题:GUI上怎么使用中文字?

  答复:导入任意中文字体,然后定义GUISkin字体为该字体即可。

  八、问题:购买一个授权可以安装几台电脑?

  答复:可以安装于2个系统之上比如一个Win版一个Mac版。

  九、问题:Max文件扔到Unity中怎么说导入失败?

  答复:下载最新版Fbx插件,用Max导出Fbx文件然后扔Unity中。

  十、问题:如何不让摄像头穿透模型,离模型近了就像模型露面了?

  答复:设置相机的Near clip plane,调小一点,但是不要给负数。

  十一、问题:怎么用双面贴图?

  答复:Unity中可设置双面Shader,最简单有效的办法是直接做成双面的实体模型,复杂一点的方法可以在材质脚本中的相应的SubShader中的一个Pass块中加入cull off,即关闭反面裁剪。

  十二、问题:导入的Fbx模型尺寸小于Max中的尺寸?

  答复:在Unity中该文件的导入设置中设置缩放因子为1。

  十三、问题:如何给相机添加Glow效果?

  答复:选中相机对象,在菜单中选中Component-Image Effects-Glow赋予该组件即可(专业版才支持此特效)。

  十四、问题:怎么设置Webplayer默认尺寸?

  答复:到菜单Edit-Project Settings-Player中设置Default Web Screen尺寸即可。

  十五、问题:怎么设置可执行文件的启动Banner?

  答复:到菜单Edit-Project Settings-Player中设置Resolution Dialog Banner。

  十六、问题:如何设置雾效?

  答复:到菜单Edit-Render Settings中开启Fog及设置Fog Color等即可。

  十七、问题:如何设定默认Skybox天空盒?

  答复:到菜单Edit-Render Settings中设置Skybox Material即可

  十八、问题:如何下载Unity3d游戏开发工具?

  答复:Unity3D下载软件开发工具和游戏引擎套件(Unity) v4.1.3 下载Unity3d 4.1.3下载是一个让你轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎综合编辑通过Unity简单的用户界面

  十九、问题:unity3d虚拟现实的设计流程?

  答复:max 制作模型,导出fbx,导入unity,设计相机代码,设计ui,build 。


版权声明:

本文由丝路设计培训学校的编辑人员所撰写,未经同意严禁转载,否则将严肃追究相关法律责任。文章原始链接:http://silucg.net/yxdhjc/unity/1199.html

unity相关文章 您可能感兴趣