Всенаправленное отображение теней с кубической картой глубины

Я работаю со всенаправленными точечными источниками света. Я уже реализовал отображение теней, используя текстуру кубической карты в качестве прикрепления цвета к 6 кадровым буферам и кодируя расстояние от света до фрагмента в каждом ее пикселе.

Теперь я хотел бы, если это возможно, изменить свою реализацию таким образом:

  • 1) прикрепить текстуру кубической карты глубины к буферу глубины моих фреймбуферов вместо цветов.
  • 2) визуализировать только глубину, не записывать цвет в этом проходе
  • 3) в основном проходе считать глубину из текстуры кубической карты, преобразовать ее в расстояние и проверить, не перекрыт ли текущий фрагмент светлый или нет.

Моя проблема возникает при обратном преобразовании значения глубины из кубической карты в расстояние. Я использую вектор света к фрагменту (в мировом пространстве), чтобы получить значение глубины в кубической карте. На данный момент я не знаю, какая из шести граней используется, и какие координаты 2D-текстуры соответствуют значению глубины, которое я читаю. Тогда как я могу преобразовать это значение глубины в расстояние?

Вот фрагменты моего кода для иллюстрации:

Текстура глубины:

glGenTextures(1, &TextureHandle);
glBindTexture(GL_TEXTURE_CUBE_MAP, TextureHandle);
for (int i = 0; i < 6; ++i)
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT,
              Width, Height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Конструкция буфера кадра:

for (int i = 0; i < 6; ++i)
{
    glGenFramebuffers(1, &FBO->FrameBufferID);
    glBindFramebuffer(GL_FRAMEBUFFER, FBO->FrameBufferID);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
            GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, TextureHandle, 0);
    glDrawBuffer(GL_NONE);
}

Фрагментный шейдер, который я пытаюсь написать для реализации своего кода:

float ComputeShadowFactor(samplerCubeShadow ShadowCubeMap, vec3 VertToLightWS)
{   
    float ShadowVec = texture(ShadowCubeMap, vec4(VertToLightWS, 1.0));
    ShadowVec = DepthValueToDistance(ShadowVec);
    if (ShadowVec * ShadowVec > dot(VertToLightWS, VertToLightWS))
        return 1.0;

    return 0.0;
}

Функция DepthValueToDistance моя актуальная проблема.

7
задан Benlitz 28 May 2012 в 19:09
поделиться