Phong和Blinn-Phong光照模型

Phong和Blinn-Phong光照模型,第1张

光照 = 环境光 + 漫反射 + 高光

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

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

        }

    }

}

内容如下:

1、 Phong、Blinn-Phong光照模型是一种简单光照模型,它仅考虑了光源直接照射的效果,没有考虑非直接光照的效果。如下直接光照与间接光照。

2、上述模型在考虑间接光此碰唯照(环境光)时,采用的是一个常数来表示,因此存在一吵闭定的局限性。全局光照模拟(Global illumination,GI)= 直接光照 + 间接光照。为了实时计算光照,引入了很多间接光照的计算方法,光线跟踪算法,考虑了光滑表面对环境光的反射和森培折射。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8205085.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存