Я работаю со всенаправленными точечными источниками света. Я уже реализовал отображение теней, используя текстуру кубической карты в качестве прикрепления цвета к 6 кадровым буферам и кодируя расстояние от света до фрагмента в каждом ее пикселе.
Теперь я хотел бы, если это возможно, изменить свою реализацию таким образом:
Моя проблема возникает при обратном преобразовании значения глубины из кубической карты в расстояние. Я использую вектор света к фрагменту (в мировом пространстве), чтобы получить значение глубины в кубической карте. На данный момент я не знаю, какая из шести граней используется, и какие координаты 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 моя актуальная проблема.