C++ 如何使用级联阴影贴图制作软阴影?

C++ 如何使用级联阴影贴图制作软阴影?,c++,glsl,vulkan,C++,Glsl,Vulkan,我正在尝试使用级联阴影映射实现软阴影 对于此测试,我使用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; for(i

我正在尝试使用级联阴影映射实现软阴影

对于此测试,我使用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;
for(int i=0;i<16;i++)
{
int index=int(16.0*随机(worldPos.xyz,i))%16;
shadow+=1.0-textureProj(projCoords+vec4(泊松盘[index]/除数,0.0,0.0),级联指数);
}
阴影/=16.0;
问题是,我使用的是级联阴影贴图,这似乎是阴影贴图中对象的大小在摄影机的不同方向之间是不同的

下面是一个示例(右下角的四元体绘制第一个级联的阴影贴图):

正如您在第二幅图像中所看到的,阴影贴图中的派克宽度小于第一幅图像中的派克宽度

因为PCF读取阴影贴图的前纹理,而不考虑摄影机的方向,所以派克看起来更小,然后更透明

在我在互联网上读到的许多软阴影算法中,我看到它们由读取阴影贴图的一些前纹理组成


我的问题是:这些算法是否与级联阴影贴图不兼容,或者是否有办法解决此问题?

您似乎正在使用最适合正交投影的方法。如果来自太阳的正交投影最适合摄影机查看平截头体的部分,则摄影机的方向将更改太阳平截头体的横截面积

解决方案是将太阳的正交平截头体拟合到包围相机平截头体每个部分的球体上。。。这可以确保正交投影所包围的区域是相同的,而与相机的方向无关