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

来源:互联网 发布:单片机串口是什么意思 编辑:程序博客网 时间:2024/05/04 09:53
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 1float 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和上一节的不同之处就在于它不仅仅计算了物体是否处于球体投影中,而且也计算了照射到此点的光线到球体中心的距离相关衰减,然后应用到最终的阴影输出,从而得到如图:


0 0
原创粉丝点击