Phong和Blinn-Phong光照模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Phong和Blinn-Phong光照模型相关的知识,希望对你有一定的参考价值。

参考技术A 光照 = 环境光 + 漫反射 + 高光

环境光 = 环境光颜色 乘以 环境光强度

float3 ambient = _LightColor0 * _AmbientStrength;

漫反射 = 光线入射方向 点乘 法线方向 ,再乘以 漫反射光颜色 乘以 漫反射光强度

float3 diff = dot(i.normal, _WorldSpaceLightPos0) * _LightColor0 * _DiffStrength;

高光 = 摄像机(观察)方向 点乘 反射光方向 , 再求这个值的 x次方 , x是高光系数 (决定了高光的聚集)。最后再乘以 高光颜色 ,乘以 高光强度 。

反射光方向 = 入射光 和 法线 方向,求反射方向。

float3 reflectDir = reflect(-_WorldSpaceLightPos0, i.normal);

float3 spec = pow(max(dot(i.viewDir, reflectDir),0.0), _SpecPow) * _LightColor0 * _SpecStrength;

在Phone光照模型的基础上,仅有一点区别。

在计算高光时,将反射光与摄像机(观察)方向的夹角, 改为了发现方向与 摄像机(观察)方向和入射方向的中间向量的夹角 。

相同条件下Blinn-Phong的高光范围要比Phong更大,写实效果Phong光照模型更好。但算法简单, 运行速度快是Blinn-Phong光照模型的优点 。

Shader "Unlit/LightShader"



    Properties

   

        _MainTex ("Texture", 2D) = "white"

        _AmbientStrength("Ambient Strength", Range(0,1.0)) = 0.1

        _DiffStrength("Diff Strength", Range(0,1.0)) = 0.1

        _SpecPow("Spec Pow", Range(0,100)) = 10

        _SpecStrength("Spec Strength", Range(0,1.0)) = 0.1

        _Brightness("Brightness", Range(0,5)) = 1

   

    SubShader

   

        Tags "LightMode"="ForwardBase"

        LOD 100

        Pass

       

            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag

             // make fog work

            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            #include "UnityLightingCommon.cginc"

            struct appdata

           

                float4 vertex : POSITION;

                float2 uv : TEXCOORD0;

                float3 normal : NORMAL;

            ;

            struct v2f

           

                float2 uv : TEXCOORD0;

                UNITY_FOG_COORDS(1)

                float4 vertex : SV_POSITION;

                float3 normal : NORMAL;

                float3 viewDir : TEXCOORD1;

            ;

            sampler2D _MainTex;

            float4 _MainTex_ST;

            float _AmbientStrength;

            float _DiffStrength;

            float _SpecPow;

            float _SpecStrength;

            float _Brightness;

            v2f vert (appdata v)

           

                v2f o;

                o.vertex = UnityObjectToClipPos(v.vertex);

                 // o.uv = v.uv;

                o.uv = TRANSFORM_TEX(v.uv, _MainTex);

                o.normal = UnityObjectToWorldNormal(v.normal);

                o.viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz);

                UNITY_TRANSFER_FOG(o,o.vertex);

                return o;

           

            fixed4 frag (v2f i) : SV_Target

           

                float4 baseColor = tex2D(_MainTex, i.uv);

                 // ambient

                float3 ambient = _LightColor0 * _AmbientStrength;

                 //diffuse

                float3 diff = dot(i.normal, _WorldSpaceLightPos0) * _LightColor0 * _DiffStrength;

                 //specular

                float3 reflectDir = reflect(-_WorldSpaceLightPos0, i.normal);

                float3 spec = pow(max(dot(i.viewDir, reflectDir),0.0), _SpecPow) * _LightColor0 * _SpecStrength;

                 //final color

                fixed4 col = float4((spec + diff + ambient), 1.0) * baseColor * _Brightness;

                 // apply fog

                UNITY_APPLY_FOG(i.fogCoord, col);

                return col;

           

            ENDCG

       

   

以上是关于Phong和Blinn-Phong光照模型的主要内容,如果未能解决你的问题,请参考以下文章

Phong和Blinn-Phong光照模型

OpenGL学习脚印:Blinn-Phong光照模型

一步步学Metal图形引擎9-《Blinn-Phong光照模型》

一步步学Metal图形引擎9-《Blinn-Phong光照模型》

Unity shader学习之Blinn-Phong光照模型

shader编程-RayMarching与Blinn-Phong光照模型搭建三维场景(WebGL-Shader开发基础08)