Unity3D与游戏开发unity修炼之路Unity Shader分享

[Unity 5.xShaders]Diffuse Shader

2016-12-21  本文已影响105人  霸俊流年

创建一个基本的 Standard Shader

关系图.png
作为一个unity的开发者,大家都知道components,所有的objects都包含了一系列的components。scripts决定了objects的逻辑,renderers决定了表现。而所有的renderers都包含几个materials。每个material都包含一个独立的shader。他们的关系如上图。

准备阶段

  1. 运行untiy5并打开一个新的工程
  2. Assets目录下新建文件夹:Shaders
  3. Assets目录下新建文件夹:Materials

如何实现

  1. 在Shaders文件夹下右键Create/Shader/Standard Surface Shader新建一个shader;
  2. 在Materials文件夹下右键Create/Material新建一个material;
  3. 把刚新建的shader和material重命名为StandardDiffuse;
  4. 把新建的shader拖给新建的material;
  5. 在场景中新建一个Cube,把新建的material拖给Cube
  6. 可以添加一个Texture给material

具体效果

效果.png

解释说明

打开的shader像这个样子:

Shader "Custom/StandardDiffuse" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

我们可以发现unity已经帮我们写了很多内容,初步需要知道:
1.第一行表明了这个shader在Unity中的路径,它会出现在你选择某个Material的shader时的下拉列表里,并且可以随时更改;
2.最后一行表明,当这个shader在当前环境中运行失败后,会默认调用Unity自带的Diffuse Shader;

这就是一个简单基于physically-based rendering的Surface Shaer,你会发现它和Unity4有很大的不同。在引入physically-based shaders前,Unity4使用了更复杂的方法。而Unity内部使用Cg语言实现,在Unity\Editor\Data\CGIncludes可以查看。

欲知后事如何,且听下回分解

上一篇下一篇

猜你喜欢

热点阅读