Хобрук: Ваш путь к мастерству в программировании

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

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


  • Я исправил функцию (добавил pos.xyz / pos.w), и теперь кажется, что она правильно преобразует x/y в соответствии с тем, что я ожидал, но z по-прежнему равно 0. Если я использую pos.w вместо pos.z как и моя глубина, она кажется инвертированной (1 = в камере, 0 = дальняя плоскость) и определенно нелинейной (или, может быть, она линейна и уходит в минусы, я не могу сказать). 09.03.2014
  • Еще одна интересная разработка... Я создал буфер для непосредственного хранения позиций, просто для проверки, и когда я читаю этот буфер и отображаю его... я получаю тот же результат. Тот же черный/красный/желтый/зеленый, что и мой фрагментный шейдер выше, и не видно синего. 10.03.2014
  • Вы уверены, что Z равно нулю, а не различным отрицательным значениям, соответствующим положению точек Z в пространстве камеры (поскольку по соглашению камеры смотрят вдоль отрицательной оси Z)? 10.03.2014
  • Я пытался отрицать z (pos.z = -pos.z;) безрезультатно. Затем я попытался добавить 1 (pos.z += 1.0;), и теперь я получаю немного синего, но только тогда, когда что-то очень близко к камере (определенно нелинейное z). 10.03.2014
  • ...Или, может быть, все это время было линейным, и я просто неправильно смотрел на это. Я изменил способ рендеринга (fragColor = vec4(position.xy, -(position.z + 1.0), 1.0)), и теперь он показывает примерно то, что я ожидал увидеть. Мало того, он идеально соответствует выходным данным моего буфера позиций (по крайней мере, насколько я могу судить). 10.03.2014
  • @HaydnV.Harach, как ты придумал это добавление 1? 06.06.2014

Ответы:


1

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

10.03.2014
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..