zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    图形与文本
    Cookie处理函数练习
    jspSmartUpload上传下载全攻略
    SmartUpload 上传图片
    无下拉菜单
    servlet中使用SmartUpload组件实现上传
    乱码
    DIV+CSS 要兼容 IE8.0 应注意些什么?
    虚拟目录中的web.config不被上级目录的web.config影响的处理
    ASP.NET抓取页面源代码
  • 原文地址:https://www.cnblogs.com/XiaoLang0/p/9518642.html
Copyright © 2011-2022 走看看