Разрешение каскадной карты теней очень низкое - PullRequest
0 голосов
/ 06 апреля 2019

Ii enter image description here В моей реализации карты каскадных теней разрешение очень низкое, как на изображении:

код, который я использовал для вычисления коэффициента тени во фрагменте sgader:

            "float readShadowMap(){"
            "    int cascadeIdx = 0;"
            "    for(int i = 0; i < NUM_CASCADES - 1; ++i){"
            "        if(FViewPos.z < cascadeEndSpace[i]){"
            "            cascadeIdx = i + 1;"
            "        }"
            "    }"
            "    vec3 ProjCoords = LightSpacePos[cascadeIdx].xyz / LightSpacePos[cascadeIdx].w;"
            "    vec2 UVCoords;"
            "    UVCoords.x = 0.5f * ProjCoords.x + 0.5f; "
            "    UVCoords.y = 0.5f * ProjCoords.y + 0.5f; "
            "    float Depth = 0.0f;"
            "    if(cascadeIdx == 0)"
            "       Depth = texture(map_shadow[0], UVCoords).x;"
            "    else if(cascadeIdx == 1)"
            "       Depth = texture(map_shadow[1], UVCoords).x;"
            "    else if(cascadeIdx == 2)"
            "       Depth = texture(map_shadow[2], UVCoords).x;"
            "    const float bias = 0.0;"
            "    if (Depth < (ProjCoords.z * 0.5 + 0.5 + 0.0001))"
            "        return 0.5;"
            "    else"
            "        return 1.0;"
            "}"

Я заметил, что если я уменьшу дальнее значение в проекции, разрешение увеличится очень немного, но все равно будет очень плохо

camera = new Cameras::Camera(peye, ptarget, width, height, 1.0f, 200.0f, 45.0f);

и каскадные разбиения:

    GLfloat cascadeSplits[NUM_CASCADES+1] = {nearClip,(farClip-nearClip)*0.08f,(farClip-nearClip)*0.2f,(farClip-nearClip)*0.6f,farClip-nearClip};
...