Я хочу рассчитать тени моих точечных светильников с помощью следующих двух проходов:
Сначала я рендерил сцену из вида pointlight в кубическую карту во всех шести направлениях с пространством моделей объектов сцены, соответствующей матрицей просмотра для лица кубической карты и матрицы проекции с углом обзора 90 градусов. Затем я сохраняю расстояние в мировом пространстве между вершиной и позицией освещения (которая является положением камеры, поэтому просто длина вершины, отображаемой в мировом пространстве).
Правильно ли хранить мировое пространство здесь?
Карта куба представляет собой типизированную текстуру GL_DEPTH_COMPONENT. Для направленного и точечного освещения достаточно хорошо работает затенение, но это одиночные 2D текстуры
Это шейдер, с помощью которого я пытаюсь сохранить расстояния:
VertexShader:
#version 330
layout(location = 0) in vec3 vertexPosition;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
out vec4 fragmentPosition_ws;
void main(){
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(vertexPosition, 1.0);
fragmentPosition_ws = modelMatrix * vec4(vertexPosition, 1.0);
}
FragmentShader:
#version 330
// Ouput data
layout(location = 0) out float fragmentdist;
in vec4 fragmentPosition_ws;
void main(){
fragmentdist = length(fragmentPosition_ws.xyz);
}
На втором шаге, при рендеринге самого освещения, я пытаюсь получить эти значения расстояния следующим образом:
float shadowFactor = 0.0;
vec3 fragmentToLightWS = lightPos_worldspace - fragmentPos_worldspace;
float distancerad = texture(shadowCubeMap, vec3(fragmentToLightWS)).x;
if(distancerad + 0.001 > length(fragmentToLightWS)){
shadowFactor = 1.0;
}
Заметки:
shadowCubeMap
является сэмплером типа samplerCube
lightPos_worldspace
это расположение света в мировом пространстве (источники света уже находятся в мировом пространстве — без модельной матрицы)
fragmentPos_worldspace
это фрагмент фрагмента в мировом пространстве (* modelmatrix)
Результат состоит в том, что все освещено иначе. не в тени. Я уверен, что рендеринг в shadowmap работает. Я попробовал несколько реализаций вычисления тени, а иногда и видел что-то вроде теней, которые могли быть объектами. НО это было с тенями глубины NDC, а не методом расстояния. Так что проверьте это и на ошибки.
Итак, наконец-то я это сделал. Я получил тени 🙂
Решение:
Я использовал, как предложено, старый метод карты теней со значениями глубины. Я делаю выборку из кубической карты, все еще используя разницу света от вершины (как в мировом пространстве), но сравниваю значение с методом vertexToDepth () из другого упомянутого вопроса.
Спасибо за вашу помощь и разъяснения
Дело в том, что всегда обязательно сравнивайте одинаковые значения! Когда глубина карты хранит worldspace-глубина, тогда также сравните с таким значением.
Других решений пока нет …