如何使用级联阴影贴图制作柔和阴影?
How to make soft shadows with cascaded shadow mapping?
我正在尝试使用级联阴影贴图实现柔和阴影。
对于这个测试,我使用PCF :
for(int i = 0; i < 16; i++)
{
int index = int(16.0*random(worldPos.xyz, i))%16;
shadow += 1.0 - textureProj(projCoords + vec4(poissonDisk[index] / divisor, 0.0, 0.0), cascadeIndex);
}
shadow /= 16.0;
问题是我使用的是级联阴影贴图,似乎阴影贴图中对象的大小在相机的不同方向之间不相同。
这里有一个例子(右下角的四边形绘制了第一个级联的阴影贴图):
(来源:noelshack.com)
(来源:noelshack.com)
正如您在第二张图片中看到的,阴影贴图中的派克宽度小于第一张图片。
因为无论相机的方向如何,PCF 都会读取阴影贴图的前部纹素,所以派克看起来更小然后更透明。
在我在互联网上阅读的许多软阴影算法中,我看到它们包括读取阴影贴图的一些前纹素。
我的问题是:这些算法是否与级联阴影贴图不兼容,或者有没有办法解决这个问题?
您似乎对正交投影使用了最适合的方法。如果来自太阳的正射投影最适合相机视锥体的部分,则相机的方向将改变太阳视锥体的横截面积。
解决方案是将太阳的正交平截头体与包含相机平截头体每个部分的球体相匹配...这样可以确保无论相机的方向如何,正交投影所包围的区域都是相同的。
我正在尝试使用级联阴影贴图实现柔和阴影。
对于这个测试,我使用PCF :
for(int i = 0; i < 16; i++)
{
int index = int(16.0*random(worldPos.xyz, i))%16;
shadow += 1.0 - textureProj(projCoords + vec4(poissonDisk[index] / divisor, 0.0, 0.0), cascadeIndex);
}
shadow /= 16.0;
问题是我使用的是级联阴影贴图,似乎阴影贴图中对象的大小在相机的不同方向之间不相同。
这里有一个例子(右下角的四边形绘制了第一个级联的阴影贴图):
(来源:noelshack.com)
(来源:noelshack.com)
正如您在第二张图片中看到的,阴影贴图中的派克宽度小于第一张图片。
因为无论相机的方向如何,PCF 都会读取阴影贴图的前部纹素,所以派克看起来更小然后更透明。
在我在互联网上阅读的许多软阴影算法中,我看到它们包括读取阴影贴图的一些前纹素。
我的问题是:这些算法是否与级联阴影贴图不兼容,或者有没有办法解决这个问题?
您似乎对正交投影使用了最适合的方法。如果来自太阳的正射投影最适合相机视锥体的部分,则相机的方向将改变太阳视锥体的横截面积。
解决方案是将太阳的正交平截头体与包含相机平截头体每个部分的球体相匹配...这样可以确保无论相机的方向如何,正交投影所包围的区域都是相同的。