我试图在我的引擎中实现级联阴影贴图,但我在最后一步有点卡住了。出于测试目的,我确保所有级联都包含我的整个场景。目前的结果如下:
级联的不同强度有意 ,实际上是问题。
这是我对片段着色器内阴影贴图进行纹理查找的方法:
layout(std140) uniform CSM
{
vec4 csmFard; // far distances for each cascade
mat4 csmVP[4]; // View-Projection Matrix
int numCascades; // Number of cascades to use. In this example it's 4.
};
uniform sampler2DArrayShadow csmTextureArray; // The 4 shadow maps
in vec4 csmPos[4]; // Vertex position in shadow MVP space
float GetShadowCoefficient()
{
int index = numCascades -1;
vec4 shadowCoord;
for(int i=0;i<numCascades;i++)
{
if(gl_FragCoord.z < csmFard[i])
{
shadowCoord = csmPos[i];
index = i;
break;
}
}
shadowCoord.w = shadowCoord.z;
shadowCoord.z = float(index);
shadowCoord.x = shadowCoord.x *0.5f +0.5f;
shadowCoord.y = shadowCoord.y *0.5f +0.5f;
return shadow2DArray(csmTextureArray,shadowCoord).x;
}
然后我使用返回值并简单地将其与漫反射颜色相乘。这解释了级联的不同强度,因为我直接从纹理中抓取深度值。我试图进行深度比较,但成效有限:
[...] // Same code as above
shadowCoord.w = shadowCoord.z;
shadowCoord.z = float(index);
shadowCoord.x = shadowCoord.x *0.5f +0.5f;
shadowCoord.y = shadowCoord.y *0.5f +0.5f;
float z = shadow2DArray(csmTextureArray,shadowCoord).x;
if(z < shadowCoord.w)
return 0.25f;
return 1.f;
}
虽然这确实给了我相同的阴影值,但它只适用于第一个级联,其他所有都是空白的:
(我为级联着色,因为否则在这种情况下转换不会被看到)
我在这里缺少什么?