Я реализую отложенное затенение в своем приложении 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
— это обратная матрица моей проекции (рассчитанная на ЦП и загруженная как унифицированный мат4). Когда я пытаюсь отобразить информацию о своем местоположении (fragColor = vec4(position, 1.0);
), экран становится черным в левом нижнем углу, красным в правом нижнем углу, зеленым в верхнем левом углу и желтым в верхнем правом углу. Это примерно то, что я ожидал бы увидеть, если бы моя глубина была равной 0,0 по всей сцене, чего, очевидно, не должно быть.
Что я делаю неправильно?