Unity SurfaceShader 开始编程

Unity SurfaceShader 开始编程


           在14年年初的时候,以前给自己定下了今年要实现的三个目标。当中之中的一个就是学会编写自己的Shader,并可以投入到实际的项目应用之中。如今,转眼间日历已经翻到了6月份,而自己关于Shader的学习,还停留在三天打鱼两天晒网的零碎学习状态,自己心里非常是着急。平时的工作任务多,挤掉了自己的学习时间是一方面。

但更重要的。还是由于自己没有制定一个稳步的计划。来监督自己利用一切可以利用的时间完毕学习的内容。相反,自己做的太过任意了。

所以。继续以博文的形式来督促自己的学习,把关于shader学习的点滴都记录下来。并制定自己的学习进度计划,在规定的时间节点,必须完毕计划的内容。迈出这一步,算是一个開始——Unity ShaderLab基础学习记录。

 

        Unity 使用自己定义的ShaderLab来组织Shader的内容。并针对不同的平台进行编译。在Unity自己定义的ShaderLab中,通过SurfaceShader结构封装了能处理不同的照明及阴影,同一时候还能在Unity的两个渲染路径(Forward和Deferred)下正常工作的极具复杂性的Shader。SurfaceShader的基本结构例如以下所看到的:

 

Shader"Custom/NewShader" {

 

         Properties {

                  // 一些属性,Shader的数据接口

         }

 

         SubShader {

                  // SubShader包装了一个渲染方案。这是我们编写Shader时的主阵地

         }

 

         SubShader {

                  // SubShader可有多个。这是为了可以让我们编写的Shader适应不同的显卡

         }

        

         FallBack "Diffuse"

}

 

我们在Properties块中可以定义的所有属性,例如以下所看到的:

 

Properties {

                  _Texture ("Texture",2D) = "white" {}             // 图片(纹理)形式的属性

                  _Color ("Color",Color) = (1, 1, 1, 1)               // 颜色属性

                  _Cube ("3D Map",Cube) = "white" {}             //3D纹理,须要6张图片

                  _Vector ("Vector4",Vector) = (1, 1, 1, 1)       // 4个元素的向量

                  _Float ("Float",float) = 1.0                             //浮点数

                  _Range ("Range", range(-10,10)) = 1.0       // 限定范围的浮点数

}

 

        在Unity的ShaderLab所提供的结构中,Shader的逻辑代码部分。都位于SubShader中的GLSLPROGRAM—ENDGLSL部分(GLSL语言)。或者是CGPROGRAM—ENDCG部分(Cg/HLSL语言),我们能够选择不同的着色器语言来进行编写。

 

        以上在Properties块中定义的属性,必须在逻辑代码块中(即GLSLPROGRAM—ENDGLSL或CGPROGRAM—ENDCG部分)再声明一次才干使用。

它们在Cg代码中的声明方式例如以下:

 

                  CGPROGRAM

                 

                  sampler2D _Texture;

                  float4 _Color;

                  samplerCUBE _Cube;

                  float4 _Vector;

                  float _Float;

                  float _Range;

                  … …          

                  ENDCG

 

        要格外注意的一点是,在Cg代码块中声明的变量名称必须与Properties块中变量的名称保持一致。否则会提示错误。

综上所述,一个SurfaceShader的完整代码为:

 

Shader"Custom/NewShader" {

         Properties {

                  _MainTex("Texture",2D) = "white" {}             // 图片(纹理)形式的属性

         }

         SubShader {

 

                  Tags {"RenderType"="Opaque" }

                  LOD 200

                 

                  CGPROGRAM

                  #pragma surface surf Lambert

 

                  sampler2D _MainTex;

                 

                  struct Input {

                          float2 uv_MainTex;

                  };

 

                  void surf (Input IN, inoutSurfaceOutput o) {

 

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

                          o.Albedo = c.rgb;

                          o.Alpha = c.a;

                  }

                  ENDCG

         }

         FallBack "Diffuse"

}

 

        这也是在Unity创建Shader默认模板。

关于此默认Shader有些内容模板,我记录下一个会被再次分析。在这里的第一篇文章: )

你可能感兴趣的:(unity)