Untiy3d ShaderLab球体阴影(二) 阴影的淡入/淡出

发表于2017-05-06
评论1 535浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群

711501594
仅仅只判断是否能看到光源还不够,还应该计算出点距离光亮地带的远近程度,也就是本篇文章要给大家介绍下球体阴影中的阴影的淡入/淡出,不明白可以看一看。

1、阴影的淡入/淡出

在上一篇的例子中,我们仅仅判断了是否能看到光源,其实不仅仅能判断是否可以看到光源,当我们看不到光源时,还可以计算出此时点距离光亮地带的远近程度,等价于到阴影中心的远近程度,这样就可计算一个带浓淡变化的阴影里,而这是在一般的阴影实现算法中比较难以做到的。

如图所示。

具体实现此效果的Shader是SphereShadow_ 2.shader,其关键代码如下:
float4 frag(v2f i):COLOR
		{
			float3 litDir=normalize(i.litDir);
			float3 spDir=i.spDir;
			float spDistance=length(spDir);
			spDir=normalize(spDir);
			float cosV=dot(spDir,litDir);
			float sinV=sin(acos(max(0,cosV)));
			float D=sinV*spDistance;
			float shadow=step(_spR,D);//spR>D 0,else 1
			float atten=pow((D/_spR),4);//计算一个到球体中心位置的衰减
			float c=lerp(1-_Intensity,1,min(1,shadow+atten));//0 is dark  //*step(0,dot(i.N,litDir))应用此衰减到输出
			return i.vc*c;
		}

该Shader和上一节的不同之处就在于它不仅仅计算了物体是否处于球体投影中,而且也计算了照射到此点的光线到球体中心的距离相关衰减,然后应用到最终的阴影输出,从而得到如图:

原文链接

著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

游戏学院公众号二维码
腾讯游戏学院
微信公众号

提供更专业的游戏知识学习平台