Unity Shader入门教程(四)反射光斑的实现

本节内容介绍PhongModel(也就是上文说的反射光的计算模型),采用的计算方法是BlinPhong(也即是用视线方向V+光源方向L的和,与N做点积,随后幂化得到高光反射系数)下图采用了csdn博文http://blog.csdn.net/u010133610/article/details/52206654中的一张插图。

1.1步:新建shadermaterial,正如我前面的教程所说的那样。

1.2步:代码如下:

▼代码开始
Shader "Custom/Learn2" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf PhongModel
        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutput o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }

        inline float4 LightingPhongModel(SurfaceOutput s, float3 lightDir, half3 viewDir, half atten)
        {
            float4 col;
            
            //首先是漫反射系数,取法和入射光的近似程度(余弦值)作为系数
            float diffuseF = max(0, dot(s.Normal, lightDir));
            
            //H表示研究点指向光源的方向(lightDir) + 研究点指向眼镜的方向(viewDir),用H和法的近似程度的幂作为高光反射系数
            float3 H = normalize(lightDir + viewDir);
            float specBase = max(0, dot(s.Normal, H));
            float specF= pow(specBase, 900);

            //漫反射+镜面高光 模型
            col.rgb = s.Albedo * _LightColor0 * diffuseF * atten +_LightColor0*specF;
            col.a = s.Alpha;
            return col;
        }


        ENDCG
    }
    FallBack "Diffuse"
}

  ▲代码结束

1.3步:应用一张纹理,然后查看效果:

以下记录了一些实验:

当上文中的900修改为以下值时对应的效果:

float specF= pow(specBase, 1);

float specF= pow(specBase, 10);

float specF= pow(specBase, 100);

float specF= pow(specBase, 1000);

float specF= pow(specBase, 10000);

——小江村儿的文杰 zouwj5@qq.com 201772821:54:01

 

原文地址:https://www.cnblogs.com/JackSamuel/p/7252819.html