Реконструированная мировая позиция из глубины неверна
Я пытаюсь реализовать отложенное затенение / освещение. Чтобы уменьшить количество / размер буферов, которые я использую, я хотел использовать текстуру глубины, чтобы позже восстановить мировое положение.
Я делаю это путем умножения координат пикселя на обратную матрицу проекции и обратную матрицу камеры. Такого рода работы, но позиция немного смещена. Вот абсолютная разница с выборочной текстурой мировой позиции:
Для справки, это код, который я использую во втором проходе фрагмента шейдера:
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;