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

在Unity2018.1.0b中学习Shader时,作者发现半兰伯特漫反射光照模型在关闭环境光源后表现异常。原本应结合环境光和漫反射的模型,却只显示了环境光效果。通过检查代码,作者发现需要对半兰伯特模型的参数设置最小值为0,以确保在无光源时仍能正确显示环境光。这是一个解决Unity Shader在无光照情况下显示问题的技巧。

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;
        }

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


上图有加入了环境光。

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

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

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

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

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

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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值