Unity shader学习之半兰伯特光照模型
半兰伯特光照模型,为Valve公司在开发游戏《半条命》时提出的一种技术,用于解决漫反射光无法到达区域无任凭明暗变化,丢失模型细节表现的问题。
其公式如下:
Cdiffuse = Clight * mdiffuse * ( dot(n, l) * 0.5 +0.5 )
通过这样的方式,将dot(n, l)的结果从[-1,1]映射到[0,1]的范围。
转载请注明出处:http://www.cnblogs.com/jietian331/p/7083289.html
shader如下:
Shader "Custom/Diffuse HalfLambert" { Properties { _Diffuse ("Diffuse", Color) = (1,1,1,1) } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { Tags { "LightMode"="ForwardBase" } // 只有设置了正确的LightMode,才能访问一些Unity提供的内置变量,如:_LightColor0 CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; }; float4 _Diffuse; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); float3 lightDir = ObjSpaceLightDir(v.vertex); lightDir = normalize(lightDir); float halfLambert = dot(lightDir, v.normal) * 0.5 + 0.5; // 将dot的结果从[-1,1]映射到[0,1]范围 float4 diffuseColor = _Diffuse * _LightColor0 * halfLambert; o.color = UNITY_LIGHTMODEL_AMBIENT + diffuseColor; return o; } fixed4 frag (v2f i) : SV_Target { return i.color; } ENDCG } } Fallback "Diffuse" }
效果如下:
正面:
背面: