Восстановление позиции из буфера глубины - отсутствует 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 по всей сцене, чего, очевидно, быть не должно.

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

1 ответ

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

Другие вопросы по тегам