半兰伯特光照模型

≡放荡痞女 提交于 2020-02-20 03:45:15

由于使用漫反射光照的时候 在光照面和半光照面结合处出现了锯齿形状,影响模型的效果,Value公司 提出一种技术,在原兰伯特光照模型基础上做出了修改解决了漫反射中的的问题,依次被称为半兰伯特光照模型

广义半兰伯特计算公式:

(C

 * M

)(α(

)+β)

没有采用max 函数来防止点积为负值,采用的是α倍的缩放和β倍的偏移。一般情况下,α和β的值均为0.5

这样也可以将结果从[-1,1]映射到[0,1],这样在被光面 也可以有明暗变化(不同的点积结果会映射成不同的值),而不是像之前那样都为0在被光面。

半兰伯特模型 是一种是视觉加强技术,没有物理依据的。

与漫反射的逐像素光照相比,只是修改了片元函数中漫反射的计算

Shader "Custom/HalfLambert"
{
    Properties
   {
       _DiffuseColor("Color",Color)=(1.0,1.0,1.0,1.0)
   }
   
   SubShader
   {     
       pass
       {
           Tags{"LightMode"="ForwardBase"}

           CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"

            fixed4 _DiffuseColor;

            struct a2v
            {
                float4 vertPos:POSITION;
                float3 normal:NORMAL; 
            };

            struct v2f
            {
                float4 pos :SV_POSITION;
                float3 normalWorld:TEXCOORD0;
            };

            v2f vert(a2v v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertPos);
                o.normalWorld=mul(v.normal,(float3x3)unity_WorldToObject);
                return o;
            }

            fixed4 frag(v2f i):SV_Target
            {
                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                fixed3 worldNormal=normalize(i.normalWorld);
                fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);
                fixed halfLambert=dot(worldNormal,worldLightDir)*0.5+0.5;
                fixed3 diffuse=_LightColor0.rgb*_DiffuseColor.rgb*halfLambert;
                return fixed4(ambient+diffuse,1);
            }

           ENDCG
       }

   }

    FallBack "Diffuse"
}

三种效果比较:向光面

背光面:

可以看出来半兰伯特光照在背面也是有明显的明暗变化

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!