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