• 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)
  • 相关阅读:
    165. Compare Version Numbers
    164. Maximum Gap
    3、桶排序
    162. Find Peak Element
    160. Intersection of Two Linked Lists
    155. Min Stack
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    Linux/Unix系统编程手册 第二章:基本概念
    Linux/Unix系统编程手册 第一章:历史和标准
  • 原文地址:https://www.cnblogs.com/XiaoLang0/p/9518642.html
Copyright © 2020-2023  润新知