您的位置:首页 > 其它

untiy 3d ShaderLab_第9章_2_球体阴影(二) 阴影的淡入/淡出

2016-10-26 10:56 190 查看
9.2 阴影的淡入/淡出

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

如图所示。

具体实现此效果的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和上一节的不同之处就在于它不仅仅计算了物体是否处于球体投影中,而且也计算了照射到此点的光线到球体中心的距离相关衰减,然后应用到最终的阴影输出,从而得到如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  阴影shader
相关文章推荐