Blinn-Phong 高光反射光照模型

1、原理

Blinn - Phong式高光反射光照模型的理论是,它是对Phong式高光反射光照模型的改进,它不再使用反射向量计算镜面反射,而是使用半角向量来进行计算(半角向量为视角方向和灯光方向的角平分线方向)

认为高光反射的颜色和 顶点法线向量以及半角向量夹角的余弦成正比
并且通过对余弦值取n次幂来表示光泽度(或反光度)

2、公式

高光反射光照颜色 = 光源的颜色 * 材质高光反射颜色 * max(0, 标准化后顶点法线方向向量 · 标准化后半角向量方向向量)幂

  • 标准化后顶点法线方向向量 · 标准化后半角向量方向向量 得到的结果就是 cosθ
  • 半角向量方向向量 = 视角单位向量 + 入射光单位向量
  • 幂 代表的是光泽度 余弦值取n次幂

3、Phong 和 Blinn-Phong 的区别

表现上的不同

  • 高光散射

Blinn - Phong模型的高光通常会产生相对均匀的高光散射,这会使物体看起来光滑而均匀

Phong模型的高光可能会呈现更为锐利的高光散射,因为它基于观察者和光源之间的夹角。这可能导致一些区域看起来特别亮,而另一些区域则非常暗。

  • 高光锐度

Blinn - Phong模型的高光通常具有较广的散射角,因此看起来不那么锐利

Phong模型的高光可能会更加锐利,特别是在观察者和光源夹角较小时,可能表现为小而亮的点。

  • 光滑度和表面纹理

Blinn - Phong模型通常更适合表现光滑的表面,因为它考虑了表面微观凹凸之间的相互作用,使得光照在表面上更加均匀分布。

Phong模型有时更适合表现具有粗糙表面纹理的物体,因为它的高光散射可能会使纹理和细节更加突出。

  • 镜面高光大小

Blinn - Phong模型通常产生的镜面高光相对较大,但均匀分布。

Phong模型可能会产生较小且锐利的镜面高光。

性能上不同

  • 因为计算半角向量方向向量只需要向量相加,比计算折射要简单,因此Bling-Phong 模型的计算通常比 Phong 模型计算更快

4、逐顶点光照

Shader "ShaderProj/1/Blinn_Phong_Specular_vertex"
{
    Properties
    {
        _SpecularColor("_MainColor", Color)=(1,1,1,1)
        _SpecularNum("_SpecularNum", Range(0, 20))=0.5
    }
    SubShader
    {
        Tags { "LightMode"="Always" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            
            struct v2f
            {
                float4 pos:SV_POSITION;
                fixed3 color:COLOR;
            };
            fixed4 _SpecularColor;
            float _SpecularNum;

            v2f vert (appdata_base v)
            {
                v2f data;

                data.pos = UnityObjectToClipPos(v.vertex);
                float3 worldPos = mul(unity_ObjectToWorld, v.vertex);
                float3 normal = UnityObjectToWorldNormal(v.normal);
                float3 viewDir = normalize(_WorldSpaceCameraPos - worldPos);
                float3 lightDir = normalize(_WorldSpaceLightPos0);
                float3 halfAngle = normalize(lightDir + viewDir);
                data.color = _LightColor0 * _SpecularColor * pow(max(0, dot(halfAngle, normal)), _SpecularNum);
                
                return data;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(i.color, 1);
            }
            ENDCG
        }
    }
}

5、逐片元光照

Shader "ShaderProj/1/Blinn_Phong_Specular_frag"
{
    Properties
    {
        _SpecularColor("_SpecularColor", Color)=(1,1,1,1)
        _SpecularNum("_SpecularNum", Range(0,20))=5
    }
    SubShader
    {
        Tags { "LightMode"="ForwardBase" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            struct v2f
            {
                float4 pos:SV_POSITION;
                float3 wPos:TEXCOORD0;
                float3 normal:NORMAL;
            };
            float4 _SpecularColor;
            float _SpecularNum;

            v2f vert (appdata_base v)
            {
                v2f data;
                
                data.pos = UnityObjectToClipPos(v.vertex);
                data.wPos = mul(unity_ObjectToWorld, v.vertex);
                data.normal = UnityObjectToWorldNormal(v.normal);

                return data;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float3 viewDir = normalize(_WorldSpaceCameraPos - i.wPos);
                float3 lightDir = normalize(_WorldSpaceLightPos0);
                float3 halfAngle = normalize(viewDir + lightDir);
                fixed3 color = _LightColor0 * _SpecularColor * pow(max(0, dot(i.normal, halfAngle)), _SpecularNum);

                return fixed4(color, 1);
            }
            ENDCG
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值