Восстановление позиции из буфера глубины — отсутствует Z?

Я реализую отложенное затенение в своем приложении OpenGL, и вместо того, чтобы тратить слишком много памяти на хранение информации о положении, я хочу восстановить положение пространства просмотра в фрагментном шейдере, используя информацию из буфера глубины. Это появляется как будто у меня есть правильный x / y, хотя я не совсем уверен, но я знаю, что моя информация z находится вне окна. Вот часть фрагмента шейдера, ответственная за восстановление позиции:

vec3 reconstructPositionWithMat(void)
{
float depth = texture2D(depthBuffer, texCoord).x;
depth = (depth * 2.0) - 1.0;
vec2 ndc = (texCoord * 2.0) - 1.0;
vec4 pos = vec4(ndc, depth, 1.0);
pos = matInvProj * pos;
return vec3(pos.xyz / pos.w);
}

matInvProj является обратной матрицей моей проекции (рассчитанной на CPU и загруженной в виде единого mat4). Когда я пытаюсь представить мою информацию о положении (fragColor = vec4(position, 1.0);), черный экран в нижнем левом углу, красный в нижнем правом углу, зеленый в верхнем левом углу и желтый в верхнем правом углу. Это примерно то, что я ожидал бы увидеть, если бы моя глубина была равномерно равна 0,0 по всей сцене, чего, очевидно, быть не должно.

Что я делаю неправильно?

2

Решение

Я обнаружил проблему, я просто неправильно интерпретировал данные. Отобразив это как (fragColor = vec4(position.xy, -(position.z + 1.0), 1.0)) результаты были такими, как я ожидал. Кроме того, когда я сравнил его с положением буфера (0.5 + (reconstructedPos - bufferPos)) моя сцена закончилась в основном серой, за исключением отдаленных регионов, где была важна точность глубины, чего я и ожидал от правильных результатов реконструкции.

0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector