Реконструированная мировая позиция из глубины неверна

Я пытаюсь реализовать отложенное затенение / освещение. Чтобы уменьшить количество / размер буферов, которые я использую, я хотел использовать текстуру глубины, чтобы позже восстановить мировое положение.

Я делаю это путем умножения координат пикселя на обратную матрицу проекции и обратную матрицу камеры. Такого рода работы, но позиция немного смещена. Вот абсолютная разница с выборочной текстурой мировой позиции:

Для справки, это код, который я использую во втором проходе фрагмента шейдера:

vec2 screenPosition_texture = vec2((gl_FragCoord.x)/WIDTH, (gl_FragCoord.y)/HEIGHT);
float pixelDepth = texture2D(depth, screenPosition_texture).x;

vec4 worldPosition = pMatInverse*vec4(VertexIn.position, pixelDepth, 1.0);
worldPosition = vec4(worldPosition.xyz/worldPosition.w, 1.0);
//worldPosition /= 1.85;
worldPosition = cMatInverse*worldPosition_byDepth;

Если я раскомментирую worldPosition /= 1.85, позиция будет восстановлена ​​намного лучше (по моей геометрии / диапазону значений глубины). Я только что получил это значение, возившись после сравнения моего вывода с тем, что должно быть (сохранено в третьей текстуре).

Я использую 0.1 рядом, 100.0 далеко, и моя геометрия примерно до 15. Я знаю, что могут быть ошибки точности, но это кажется слишком большой ошибкой слишком близко к камере. Я что-то здесь пропустил?

1 ответ

Решение

Как упоминалось в комментарии: я не конвертировал значение глубины из пространства ndc в пространство клипа. Я должен был добавить эту строку:

pixelDepth=pixelDepth*2.0-1.0;
Другие вопросы по тегам