Выборка буфера глубины и нормализация до [0,1] (DirectX) - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь визуализировать (для целей отладки) глубину сцены на текстурированном квадре (я хочу отобразить глубину водоема на поверхности воды). Итак, я делаю рендеринг сцены с точки зрения камеры в буфер глубины, а затем привязываю тот же буфер глубины, что и ресурс шейдера, к шейдеру воды. Но когда я пробую текстуру, я всегда получаю полную белую текстуру. Я использовал pow(value, 100.0), и я получил небольшое изменение, которое корректно следит за глубиной рельефа под водой, поэтому я должен предположить, что некоторые значения есть, но они находятся в небольшом диапазоне около 1,00. Поэтому я попытался нормализовать значения, инвертировав преобразование перспективы для z (из пространства клипа обратно в пространство глаза) с помощью следующего уравнения:

float linearDepth = near * far / (far - depth * (far - near));

но опять же, белый. Формула мне кажется правильной (я нашел ее в книге Фрэнка Луны, и даже если сам вычислю матрицу проекции, я ее получу). Дальний и ближний плоскости находятся в диапазоне 0,1 300,0, но даже игра с этими значениями никуда меня не приведет.

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

1 Ответ

0 голосов
/ 14 мая 2018

Вы правы, что при стандартной матрице проекции распределение значений глубины будет очень близко к значению 1 (только очень близкие объекты будут показывать видимую разницу). Если дальняя плоскость действительно, очень близко, вы не увидите значения значительно ниже 1. Это также усугубляется тем фактом, что человеческий глаз не видит маленьких дельт в ярких цветах почти так же хорошо, как между темными цветами (так вы менее способны видеть изменения).

Вы определенно на правильном пути с вашей линеаризацией буфера глубины. В прошлом я работал (в OpenGL, поэтому YMMV) с чем-то вроде следующего:

float lineardepth = (2.0f * near) / (far + near - depth * (far - near));

Это должно быть очень близко к тому, что будет работать и в D3D.

...