Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Линейная глубина... в вершинном шейдере. Это вообще возможно?

Линейная глубина... в вершинном шейдере. Это вообще возможно?

Advanced: Тема повышенной сложности или важная.
vindastПостоялецwww9 ноя. 20182:34#0
Сразу скажу, это читал: https://gamedev.ru/code/tip/?id=4616 - не работает с opengl.
И это тоже: http://www.mvps.org/directx/articles/linear_z/linearz.htm - но она сама по себе косячная, то есть отличается от реальной линейной глубины, хотя распределение линейное + для  восстановления позиции из нее, придется хранить еще одно (минимум 16F) число, что не круто.

И что в линейную глубину ( с использованием фрагментного шейдера) смог.

Собственно, как нужно извернутся, что бы глубина в gl_Position была линейной? Подскажите хотя бы куда копать.

Если что, замыслил я делать форвард+. Так что мне критически важно чтобы тест глубины всегда был корректен. (в плане того, значение глубины должно быть правильным до фрагментного шейдера, никаких gl_FragDepth)

Ну и если не выйдет, то придется отказаться от линейной глубины в основном рендере сцены, оставив его для теней. Грустно вспоминать, что hbao и ssao любят линейную глубину. (И я знаю что можно восстановить линейную глубину из логарифмической, но как-то грустно, по тому что много что сделал именно с линейной глубиной)

vindastПостоялецwww9 ноя. 20182:52#1
Если что, я про early z test.
MrShoorУчастникwww9 ноя. 20183:42#2
vindast
> Сразу скажу, это читал: https://gamedev.ru/code/tip/?id=4616 - не работает с opengl.
Доработай до OpenGL. Хотя не знаю нафига такое дорабатывать, если оно впринципе ломает перспективную проекцию (и еще не факт что с глубиной все остается нормально)

> И это тоже: http://www.mvps.org/directx/articles/linear_z/linearz.htm
А это вообще математически неверный опус. Глубина будет верная только для вершин, а не для пикселей внутри треугольника. Такую статью лучше вообще не читать.

> Собственно, как нужно извернутся, что бы глубина в gl_Position была линейной?
> Подскажите хотя бы куда копать.
> Если что, замыслил я делать форвард+.
Я не понимаю, зачем тебе для форвард+ именно линейная глубина?

MrShoorУчастникwww9 ноя. 20183:44#3
vindast
> Грустно вспоминать, что hbao и ssao любят линейную глубину.
С hbao не работал, я для обычного ssao (который по полусфере) линейная глубина не критична.

Правка: 9 ноя. 2018 3:44

SuslikМодераторwww9 ноя. 20188:35#4
vindast
глубина линеаризуется либо отдельным проходом в image space фрагментным шейдером, либо в основном проходе записью линейной глубины вместе остальным gbuffer'ом через mrt. насколько я понимаю, правильную интерполяцию между вершинами с линейной глубиной получить нельзя, так как интерполировать надо именно в однородных координатах.

а обычный hbao прекрасно можно реализовать и без линейной глубины. тебе вообще не должно быть разницы, как именно хранится глубина, нужна только функция, которая по двумерным экранным координатам возвращает трёхмерные мировые (выполняет обратную проекцию). при этом реализовываться она может вообще как угодно.

Правка: 9 ноя. 2018 8:38

vindastПостоялецwww9 ноя. 201814:29#5
MrShoor, Suslik, спасибо всем. Понял что ничего не сделаешь в вершинном шейдере.
MrShoor
> Я не понимаю, зачем тебе для форвард+ именно линейная глубина?
Да не зачем, просто привык работать с линейной глубиной уже (плюсы и минусы по сравнению с гиперболической знаю), но и с гиперболической тоже работать умею.

Спрошу тогда такой вопрос.
Сделаю линейную глубину при предварительном проходе глубины.
При втором проходе, с полноценной растеризацией и расчете освещения, сделать ручной тест глубины, через дискард во фрагметном шейдере ( в самом начале), сильно ли просядет производительность, по сравнению с ранним тестом глубины?

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр