OpenGL Pointlight Shadowmapping с кубическими картами

Я хочу рассчитать тени моих точечных светильников с помощью следующих двух проходов:

Сначала я рендерил сцену из вида 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, а не методом расстояния. Так что проверьте это и на ошибки.

-1

Решение

Итак, наконец-то я это сделал. Я получил тени 🙂

Решение:
Я использовал, как предложено, старый метод карты теней со значениями глубины. Я делаю выборку из кубической карты, все еще используя разницу света от вершины (как в мировом пространстве), но сравниваю значение с методом vertexToDepth () из другого упомянутого вопроса.

Спасибо за вашу помощь и разъяснения

Дело в том, что всегда обязательно сравнивайте одинаковые значения! Когда глубина карты хранит worldspace-глубина, тогда также сравните с таким значением.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]