Что такое скрытая проблема поверхности и почему точность буфера z имеет значение? - PullRequest
0 голосов
/ 17 февраля 2020

Как новичок в OpenGL (и компьютерной графике в целом) мне довольно любопытно задать следующие вопросы:

  1. Я знаю, что такое Z-буфер, это буфер глубины, который хранит значение в диапазоне от 0 до 1. Но почему его точность имеет значение?

  2. Что такое скрытая проблема поверхности?

  3. В чем проблема при использовании линейный Z-буфер?

  4. Почему мы заботимся о точности Z-буфера?

1 Ответ

1 голос
/ 17 февраля 2020
  1. Точность Z-буфера

    В GL разработан буфер глубины, поэтому точность визуально не уменьшается с расстоянием ... это означает, что если вы визуализируете бесконечную плоскость который пересекает плоскости znear и zfar и использует сохраненную глубину в качестве цвета, вы увидите плоскость, представленную в виде параллельных полос с одинаковой визуальной шириной. Примерно так:

    non linear depth

    Это обеспечивает более или менее одинаковые визуальные детали по всей сцене. Однако, когда вы начнете смотреть на геометрическую точность ее нелинейности и из числовой статистики, вы увидите, что большая часть диапазона <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)
    
  2. удаление скрытой поверхности

    это обходной путь к алгоритму Painters, где объекты более отдалены от камера перекрашивается объектами ближе. Алгоритм рисования в графике называется Z-sorting и требует отрисовки материала по порядку. Буферизация глубины - это обходной путь, при котором вы сохраняете значение глубины уже отрендеренного материала и визуализируете, только если вы ближе к камере. Это устраняет необходимость рендеринга по порядку, в то же время достигая того же результата.

    Однако, если точность глубины слишком низкая, рендеринг не может достоверно определить, что находится в шкафу, а что нет:

    depth precision

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

  3. проблемы линейной глубины

    Буфер линейной глубины не является родным для GL, поэтому вы нужно немного обойти реализацию GL. К счастью, с GLSL это действительно просто и дешево сейчас без потери точности и производительности. Для получения дополнительной информации см. Ссылку выше. Однако линейная глубина означает, что мы получили одинаковую геометрическую точность по всей сцене. Таким образом, для тех же деталей нам нужно больше битов для буфера глубины в случае близких к znear объектов. Вот почему линейный буфер глубины больше подходит для сцен с большим динамическим диапазоном глубины c, где нелинейные буферы глубины ведут себя плохо. Таким образом, сцены с большими объектами, идущими от znear до zfar, такими как местности, большие космические корабли, города и т. Д. c ...

  4. Зачем заботиться о точности глубины ?

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

    Необходимо учитывать, что буфер глубины битовая пропускная способность довольно ограничена. Обычные значения 16/24/32, но только для возрастов 16/24, где доступно на большинстве HW. Только в последние годы у нас может быть 32, а на некоторых картах даже 64, но IIR C, который больше не является собственным буфером глубины и нуждается в дополнительном коде для его включения ...

Есть также другие методы, кроме линейного буфера глубины, для достижения высокого динамического диапазона глубины сцены c см:

...