Phong 光照模型(鏡面反射)

Phong 光照模型

  鏡面反射(高光),是光線通過物體表面,反射到視野中,當反射光線與人的眼睛看得方向平行時,強度最大,高光效果最明顯,夾角爲90度時,強度最小。優化

  specular = I*R*V;spa

    specular:反射光通過物體表面反射後進入人眼的光強;3d

    I:反射光的光強,Phong依然是理想模型,因此不考慮光的衰減,即反射光的光強和入射光的光強相等;code

    R:反射光線的方向;orm

    V:視線的方向;blog

Shader程序

 

/*******************************************
Phong 光照模型
    1. 理想的鏡面反射;
*******************************************/
Shader "JQM/Specular"
{
    Properties
    {
        _Color("Color", color) = (1.0,1.0,1.0,1.0)
        _SpecColor("Specular Color", color) = (1.0,1.0,1.0,1.0)
        _Shininess("Shininess",float) = 10
    }
    SubShader{
        Pass{
            
            Tags { "LightMode" = "ForwardBase"}

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            //使用自定義變量
            uniform float4 _Color;
            uniform float4 _SpecColor;
            uniform float _Shininess;

            //使用Unity定義的變量
            uniform float4 _LightColor0;

            struct vertexInput{
                float4 vertex:POSITION;
                float3 normal:NORMAL;
            };

            struct vertexOutput{
                float4 pos:SV_POSITION;
                float4 posWorld:TEXCOORD0;
                float3 normalDir:TEXCOORD1;
            };

            //頂點程序
            vertexOutput vert(vertexInput v)
            {
                vertexOutput o;

                o.posWorld = mul(_Object2World, v.vertex);
                o.normalDir =  normalize( mul(float4(v.normal,0.0),_World2Object).xyz);//將模型空間的法線轉到世界空間

                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                return o;
            }

            //片斷程序
            float4 frag(vertexOutput i):COLOR
            {

                float3 normalDirection = i.normalDir;
                float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz- i.posWorld.xyz);//視線方向
                float3 lightDirection;
                float atten = 1.0;

                lightDirection = normalize(_WorldSpaceLightPos0.xyz);//光線方向
                float3 diffuseReflection = atten * _LightColor0.xyz *  max(0.0, dot(normalDirection,lightDirection));//計算蘭伯特漫反射
                float3 specularReflection = atten * _LightColor0.xyz * _SpecColor.rgb*max(0.0, dot(normalDirection,lightDirection))*pow(max(0,dot(reflect(-lightDirection,normalDirection),viewDirection)),_Shininess);//計算高光
                float3 lightFinal = diffuseReflection +specularReflection+ UNITY_LIGHTMODEL_AMBIENT.xyz;
                return float4(lightFinal*_Color.rgb,1.0);
            }

            ENDCG
        }
    }
    
}

 

Blinn-phong 高光

  這個方式的高光是一種數學模型的優化,它將計算反射向量的過程替換爲計算視線和光線的半角向量,提升了運算速度,它的效果比較平滑,運算速度快。數學

相關文章
相關標籤/搜索