当前位置:丝路教程网 > Unity3D >

Unity 3D教程之如何用shader渲染游戏3D角色

本篇Unity 3D教程主要介绍一下如何利用Shader来渲染游戏中的3D角色,以及如何利用Unity提供的Surface Shader来书写自定义Shader。
学设计来丝路教程网

但愿每次回忆,对生活都不感到负疚! —— 郭小川 开始学习

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

  一、 从Shader开始

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

  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渲染效果。

Unity 3D教程

  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”):

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

  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”):

  其显示效果如下:

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

还有什么问题没解决的?点击【咨询专业老师想要咨询相关课程点击【课程咨询

首发地址: Unity 3D教程之如何用shader渲染游戏3D角色_室内设计教程|Ui设计教程|Cad、3Dmax软件教程-丝路教程网

资源地址: http://blog.silucg.com/unity/7692.html(分享请保留)


丝路教程网先学习后付款

相关热词: Unity Unity 3D教程 3d教程

免费获取最新教程

姓名
手机号
QQ
需求资料
 
Copyright © 2008-2017 blog.silucg.com 丝路教程网 版权所有 网站地图 PS软件 | 3DMAX软件 | Revit软件 | Maya软件 | CAD软件 | AI软件 | BIM软件 | VRay渲染器 |
点击这里给我发消息
0元免费学设计
姓名:
电话:
微信:
QQ:
课程: