Shader例子(1) 高光效果(surf/顶点)

来源:互联网 发布:linux more 倒序 编辑:程序博客网 时间:2024/05/01 22:29

效果
这里写图片描述
一、surf

Shader "Custom/surf镜面高光" {        //------------------------------------【属性值】------------------------------------      Properties {         //主颜色        _Color ("Color", Color) = (1,0,0,1)        //主纹理        _MainTex ("Albedo (RGB)", 2D) = "white" {}        //高光颜色        _SpecColor  ("SpecColor", Color) = (1.0,1.0,1.0,1)        //高光系数        _Shininess  ("Shininess ", Range(0.01,1)) = 0.4    }    //------------------------------------【唯一的子着色器】------------------------------------    SubShader {        //【注意:Surface Shader不能使用Pass,直接在SubShader中实现即可】          //渲染类型设置:不透明        Tags { "RenderType"="Opaque" }        //细节层次设为         LOD 300        //===========开启CG着色器语言编写模块===========         CGPROGRAM        //编译指令:告知编译器表明着色函数的名称为surf          #pragma surface surf BlinnPhongTest         //编译指令: 指定着色器编译目标为Shader Model 3.0        #pragma target 3.0        //变量的声明        sampler2D _MainTex;        //fixed4 _SpecColor;        half _Shininess;        fixed4 _Color;        //表面输入结构体        struct Input {            float2 uv_MainTex; //纹理坐标        };        //--------------------------------【表面着色函数】-----------------------------          //输入:表面输入结构体         //输出:Unity 内置的SurfaceOutputStandard结构体         /* 原型如下:         struct SurfaceOutputStandard                      {                             fixed3 Albedo;                  // 漫反射颜色                             fixed3 Normal;                  // 切线空间法线                             half3 Emission;                 // 自发光                             half Metallic;                  // 金属度;取0为非金属, 取1为金属                             half Smoothness;                // 光泽度;取0为非常粗糙, 取1为非常光滑                             half Occlusion;                 // 遮挡(默认值为1)                             fixed Alpha;                    // 透明度                      };          */        //---------------------------------------------------------------------------------         //计算颜色输出        void surf (Input IN, inout SurfaceOutput o) {            // 取主纹理的对应当前像素点的值            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);            o.Albedo = c.rgb* _Color.rgb;               o.Gloss = c.a;  //整体光滑度,高光计算结果的附加系数,值越大,    高光反射越清晰,0则无高光效果            o.Specular = _Shininess; // 高光点,越小光泽度越高,0为全白            o.Alpha = c.a;        }        //对输出颜色进一步处理        float4 LightingBlinnPhongTest(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten)        {        // 1.半角向量:求(点到光源+点到摄像机)的单位向量,他们的中间平均值        float3 h = normalize(lightDir + viewDir);            // 2.漫反射系数【点到光源单位向量与法线向量的余弦值】        float diff = max(0, dot(s.Normal, lightDir));          // 3.高光底数【半角向量与法线向量的余弦值】        float nh = max(0, dot(s.Normal, h));             // 4.高光系数:根据高光低数和高光指数求得        float spec = pow(nh, s.Specular * 128.0) * s.Gloss;          float4 c;        // 5.最终光照rgb = 漫反射+半角高光        c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * _SpecColor.rgb * spec) * (atten * 2);        c.a = s.Alpha + _LightColor0.a * _SpecColor.a * spec * atten;        return c;        }        ENDCG    }     FallBack "Diffuse"}

二、顶点shader

Shader "Custom/镜面高光10" {    Properties    {        _Color("表面颜色",Color) = (1.0,1.0,1.0,1.0)        _Threshold("加强系数",float) = 10 //高光加强系数        _HightColor("高光颜色",Color) = (1.0,1.0,1.0,1.0)    }SubShader{Pass{ Tags{"LightMode" = "ForwardBase"}ZWrite OffCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"            float4 _Color;            float _Threshold;            float4 _HightColor;            float4 _LightColor0;            struct vertexInput            {                float4 vertex : POSITION;                float3 normal : NORMAL;            };            struct vertexOutput            {                float4 pos : SV_POSITION;                float4 col : COLOR;            };            vertexOutput vert(vertexInput input)            {                vertexOutput output;                output.pos = mul(UNITY_MATRIX_MVP,input.vertex);                float3 normalDir = normalize(mul(float4(input.normal,0.0),_World2Object).xyz);                float3 viewDir = normalize(_WorldSpaceCameraPos-mul(_Object2World,input.vertex));                float3 lightDir;                float factor;                if(0.0 ==_WorldSpaceLightPos0.w){                factor =1;                lightDir = normalize(_WorldSpaceLightPos0);                }else{                float3 lightDirection =  normalize(_WorldSpaceLightPos0-mul(_Object2World,input.vertex).xyz);                float dis = length(lightDirection);                factor = 1/dis;                lightDir = normalize(lightDirection);                }                float3 diffuseLight = factor * _LightColor0.rgb * _Color.rgb * max(0.0,dot(normalDir,lightDir));                float3 hightLightDir;                if(dot(normalDir,lightDir)<=0.0)                {                hightLightDir = float3(0.0,0.0,0.0);                }                else                {                 hightLightDir =  reflect(-lightDir,normalDir);                }                float3 hightLight = factor * _LightColor0.rgb *_HightColor.rgb * pow(max(0.0,dot(hightLightDir,viewDir)),_Threshold);                float3 ambientLighting = UNITY_LIGHTMODEL_AMBIENT.rgb * _Color.rgb;                output.col = float4(diffuseLight+hightLight+ambientLighting,0.0);                return output;            }           float4 frag(vertexOutput input):COLOR           {                return input.col;           }ENDCG      }      Pass{ Tags{"LightMode" = "ForwardAdd"}ZWrite OffBlend One OneCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"            float4 _Color;            float _Threshold;            float4 _HightColor;            float4 _LightColor0;            struct vertexInput            {                float4 vertex : POSITION;                float3 normal : NORMAL;            };            struct vertexOutput            {                float4 pos : SV_POSITION;                float4 col : COLOR;            };            vertexOutput vert(vertexInput input)            {                vertexOutput output;                output.pos = mul(UNITY_MATRIX_MVP,input.vertex);                float3 normalDir = normalize(mul(float4(input.normal,0.0),_World2Object).xyz);                float3 viewDir = normalize(_WorldSpaceCameraPos-mul(_Object2World,input.vertex));                float3 lightDir;                float factor;                if(0.0 ==_WorldSpaceLightPos0.w){                factor =1;                lightDir = normalize(_WorldSpaceLightPos0);                }else{                float3 lightDirection =  normalize(_WorldSpaceLightPos0-mul(_Object2World,input.vertex).xyz);                float dis = length(lightDirection);                factor = 1/dis;                lightDir = normalize(lightDirection);                }                float3 diffuseLight = factor * _LightColor0.rgb * _Color.rgb * max(0.0,dot(normalDir,lightDir));                float3 hightLightDir;                if(dot(normalDir,lightDir)<=0.0)                {                hightLightDir = float3(0.0,0.0,0.0);                }                else                {                 hightLightDir =  reflect(-lightDir,normalDir);                }                float3 hightLight = factor * _LightColor0.rgb *_HightColor.rgb * pow(max(0.0,dot(hightLightDir,viewDir)),_Threshold);                float3 ambientLighting = UNITY_LIGHTMODEL_AMBIENT.rgb * _Color.rgb;                output.col = float4(diffuseLight+hightLight+ambientLighting,0.0);                return output;            }           float4 frag(vertexOutput input):COLOR           {                return input.col;           }ENDCG      }   }}
0 0
原创粉丝点击