[shader] pow函数对phong高光影响的理解

@[TOC][shader] pow函数对phong高光影响的理解

phong光照模型要素:
1 视线方向 【normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz) ;】
2 光经过模型的反射方向 【normalize(reflect(-_WorldSpaceLightPos0.xyz, nDir));】
3 pow函数对高光范围的控制

Shader "Unlit/Phong"
{
     
    Properties
    {
     
        _Power ("高光次幂", range(0,100)) = 2
    }
    SubShader
    {
     
        Tags {
      "RenderType"="Opaque" }
        LOD 100

        Pass
        {
     
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fog

            #include "UnityCG.cginc"
            float _Power;
            struct appdata
            {
     
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };

            struct v2f
            {
     
                float4 pos : SV_POSITION;//SV_POSITION 用来转到世界空间位置 会产生麻烦  应该是用来转到裁剪空间的(踩坑)
                float4 posWS : TEXCOORD1;
                float3 normal : TEXCOORD0;
            };

            v2f vert (appdata v)
            {
     
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.posWS = mul(unity_ObjectToWorld, v.vertex);
                o.normal = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
     
                float3 nDir = i.normal;
                float3 vDir =normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz) ;
                float3 lDir = _WorldSpaceLightPos0.xyz;//该关键词的方向是有模型指向光源的 所以第五十行代码需要将lDir取反。
                float3 rDir =normalize(reflect(-lDir, nDir));
                float phong = pow(max(0,dot(vDir, rDir)),_Power);
                //pow函数对phong高光影响的理解;
                //pow(x,y)的意思是以x为底,x的y次方,phong模型中有黑白灰 三个层次,该函数的作用就是把灰色部分变黑,是高光变小
                //黑色部分的值为0,白色部分的值为1,灰色部分的值介于两者之间,也就是(0,1)这个区间,
                //pow函数执行之后,每个像素颜色乘以自己本身,本来是黑的部分零乘以零还是零 依然是黑色,
                //白的部分一乘以一,依然是白色。
                //灰色部分因为是介于零到一的小数,所以会越乘越小,0.5 * 0.5 = 0.25,值变小之后,部分像素颜色就变黑,白色的高光范围也就缩小了
                //从而达到了用pow函数来控制高光范围大小的效果
              
                return phong;
            }
            ENDCG
        }
    }
}

你可能感兴趣的:(Shader,shader,unity)