Точность Z-буфера
В GL разработан буфер глубины, поэтому точность визуально не уменьшается с расстоянием ... это означает, что если вы визуализируете бесконечную плоскость который пересекает плоскости znear
и zfar
и использует сохраненную глубину в качестве цвета, вы увидите плоскость, представленную в виде параллельных полос с одинаковой визуальной шириной. Примерно так:
Это обеспечивает более или менее одинаковые визуальные детали по всей сцене. Однако, когда вы начнете смотреть на геометрическую точность ее нелинейности и из числовой статистики, вы увидите, что большая часть диапазона <0,1>
очень близка к znear
.
Как только наши компьютеры смогли обрабатывать больше и В более детальных сценах это поведение стало проблемой, так как внезапно мы захотели увидеть детали в более отдаленных местах, где приращение значения глубины обычно больше, чем весь визуализированный объект ...
Чтобы исправить это, мы можем использовать линейный буфер глубины (для сцен с большим динамическим диапазоном глубины c или очень большими объектами).
позволяет использовать буфер глубиной 16 бит, что означает 2 ^ 16 значений без знака, поскольку у нас есть знак чем его 2^15 = 32768
возможных значений.
Теперь для линейной глубины это означает, что точность глубины (минимальное приращение / изменение / дельта) составляет
dz = (zfar-znear)/2^(bits-1)
, например, пусть znear=0.1
и zfar=1000
затем:
dz = (1000-0.1)/32768 = 0.03
по всей сцене. Теперь, когда мы возвращаемся к нелинейной глубине, dz
намного меньше около znear
, но намного больше около zfar
, и использование его в качестве критерия детализации бесполезно. Вместо этого лучше выполнить это:
zfar/znear < 2^(bits-1)
удаление скрытой поверхности
это обходной путь к алгоритму Painters, где объекты более отдалены от камера перекрашивается объектами ближе. Алгоритм рисования в графике называется Z-sorting
и требует отрисовки материала по порядку. Буферизация глубины - это обходной путь, при котором вы сохраняете значение глубины уже отрендеренного материала и визуализируете, только если вы ближе к камере. Это устраняет необходимость рендеринга по порядку, в то же время достигая того же результата.
Однако, если точность глубины слишком низкая, рендеринг не может достоверно определить, что находится в шкафу, а что нет:
Слева точность хорошая, справа плохая. Как вы можете видеть, одна и та же геометрия визуализируется по-разному с неправильной точностью глубины.
проблемы линейной глубины
Буфер линейной глубины не является родным для GL, поэтому вы нужно немного обойти реализацию GL. К счастью, с GLSL это действительно просто и дешево сейчас без потери точности и производительности. Для получения дополнительной информации см. Ссылку выше. Однако линейная глубина означает, что мы получили одинаковую геометрическую точность по всей сцене. Таким образом, для тех же деталей нам нужно больше битов для буфера глубины в случае близких к znear
объектов. Вот почему линейный буфер глубины больше подходит для сцен с большим динамическим диапазоном глубины c, где нелинейные буферы глубины ведут себя плохо. Таким образом, сцены с большими объектами, идущими от znear
до zfar
, такими как местности, большие космические корабли, города и т. Д. c ...
Зачем заботиться о точности глубины ?
, чтобы избежать артефактов рендеринга, таких как подгонка глубины / разрыв глубины, неправильные пересечения геометрии, неправильные расширенные эффекты и т. Д. c ...
Необходимо учитывать, что буфер глубины битовая пропускная способность довольно ограничена. Обычные значения 16/24/32
, но только для возрастов 16/24
, где доступно на большинстве HW. Только в последние годы у нас может быть 32, а на некоторых картах даже 64, но IIR C, который больше не является собственным буфером глубины и нуждается в дополнительном коде для его включения ...
Есть также другие методы, кроме линейного буфера глубины, для достижения высокого динамического диапазона глубины сцены c см: