Surface Shader(表面着色器)

Shader "Custom/Surface_Shadeer" {               

         Properties {                                                     //属性

                   _Color ("主颜色", Color) = (1,1,1,1)

                   _MainTex ("主纹理", 2D) = "white" {}

                   _NormalTex ("法线纹理", 2D) = "" {}

         }

         //子着色器

         SubShader {

                   Tags { "RenderType"="Opaque" }             //标签

                   LOD 200                                                                    //多层次细节  高效渲染的运算

                    //开始CG着色器编程语言段   surface 固定格式  

        CGPROGRAM

        //1.光照模式声明:使用兰伯特光照模式    surface 固定格式  声明为表面着色器  Lamber是漫反射光照模式

        #pragma surface surf Lambert

        //2.输入结构   主要是用来接收外部的数据 

        struct Input  

        { 

            //四元素的颜色值(RGBA) 

            float4 color : COLOR; 

            float2 uv_MainTex;//uv + 变量名称  就可以获取当前的uv点  可以直接使用  是一个固定的结构

        };

                   sampler2D _MainTex;                        //声明一张贴图

        float4 _MainColor;                     //声明主颜色

        sampler2D _NormalTex;          //声明法线贴图

                   //3.表面着色函数的编写实现方法

                    void surf (Input IN, inout SurfaceOutput o)  {

            //反射率  float3 表示三维变量  floa4表示四维变量

           // o.Albedo = float3(0.5,0.8,0.3);       //(0.5,0.8,0.3)分别对应于RGB分量 

           //而o.Albedo = 0.6;等效于写o.Albedo = float3(0.6,0.6,0.6); 

           //改变着色器颜色

           o.Albedo = _MainColor.rgb;

           //给当前着色器贴图赋值  四维颜色转三维RGB

           o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;

           //给当前着色器的法线赋值  首先获取到法线贴图的颜色输出值tex2D(_NormalTex, IN.uv_MainTex)   但是需要把颜色输出值转换成法线向量赋值给着色器 也就是赋值给 o.Normal

           o.Normal = UnpackNormal(tex2D(_NormalTex, IN.uv_MainTex));

                   }

                   ENDCG //结束CG着色器编程语言段

         }

         FallBack "Diffuse"    //备用渲染方式 “”里面填的内容为Shader的路径

}

注:此着色器与unity 3d 本身预制的光照进行计算 ,Lambert和BlinnPhong,或者是自定义的光照模型 ,void surf (Input IN,inout SurfaceOutput 0)是其重要的显示实现函数,作用是接收  struct Input 函数的UV等数据的输入,进行处理,然后将结果填充显示在SurfaceOutput中。

支持个人观看使用,如商用或转载,请告知! -----萧朗(QQ:453929789 Email:xiaolang_xl@sina.com)
原文地址:https://www.cnblogs.com/XiaoLang0/p/9518642.html