Unity Shader踩坑笔记-2 ForwordBase-半兰伯特光照模型的问题记录

Shader学习使用的是Unity2018.1.0b

      在学习基础光照模型时,除了逐顶点光照和逐像素光照以外,为了给无光照的阴影部分增强视觉效果,我们也会使用半兰伯特漫反射光照模型,然而在使用半兰伯特模型时,一旦关闭环境中的光源(有环境光)会出现很有趣的现象。

      逐顶点光照的顶点着色器:

        void vert(in a2v v,out v2f o){

        o.pos=UnityObjectToClipPos(v.vertex);
	fixed3 Amb = UNITY_LIGHTMODEL_AMBIENT.xyz;
        float3 worldNormal = normalize(mul(v.normal,(float3x3)unity_WorldToObject));
	float3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
	fixed3 diffuse1 = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal , worldLight));

        o.color = Amb + diffuse1;
        }


      逐顶点光照的半兰伯特模型顶点着色器:

void vert(in a2v v,out v2f o){

        o.pos=UnityObjectToClipPos(v.vertex);
	fixed3 Amb = UNITY_LIGHTMODEL_AMBIENT.xyz;

	float3 worldNormal = normalize(mul(v.normal,(float3x3)unity_WorldToObject));

	float3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
	fixed  halfLan = 0.5*dot(worldNormal,worldLight) + 0.5;
	fixed3 diffuse1 = _LightColor0.rgb * _Diffuse.rgb * halfLan;

        o.color = Amb + diffuse1;
        }

右侧为半兰伯特模型的表现效果:

Unity Shader踩坑笔记-2 ForwordBase-半兰伯特光照模型的问题记录_第1张图片

上图有加入了环境光。

然后,当我们把hierarchy面板中的Directional Light禁用掉,有趣的现象就出现了。

直接看代码,半兰伯特漫反射模型的光照是环境光+漫反射才对,然而,我们看到的却是:

Unity Shader踩坑笔记-2 ForwordBase-半兰伯特光照模型的问题记录_第2张图片

为了能让半兰伯特漫反射模型能在无光照时正确的表现环境光的效果,代码可以进行一点点修改即可:

		fixed  halfLan = 0.5*dot(worldNormal,worldLight) + 0.5;
		fixed3 diffuse1 = _LightColor0.rgb * _Diffuse.rgb * max(0.0,halfLan);

对半兰伯特模型的参数进行不小于0的限制,就可以正常的反应环境光了。

至于具体的原因嘛,要对shader进行调试才知道啦~~或者哪位看到的大佬直接留言告诉我,万分感谢呢


你可能感兴趣的:(shader)