级联阴影映射 - 纹理查找

时间:2014-08-16 11:41:14

标签: opengl rendering glsl shader shadow

我试图在我的引擎中实现级联阴影贴图,但我在最后一步有点卡住了。出于测试目的,我确保所有级联都包含我的整个场景。目前的结果如下:

CSM Different cascade intensities

级联的不同强度有意 ,实际上是问题。

这是我对片段着色器内阴影贴图进行纹理查找的方法:

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;
}

虽然这确实给了我相同的阴影值,但它只适用于第一个级联,其他所有都是空白的:

CSM only works for first cascade - others are blank

(我为级联着色,因为否则在这种情况下转换不会被看到)

我在这里缺少什么?

0 个答案:

没有答案