Тестирование Z-глубины в OpenGL - PullRequest
8 голосов
/ 27 июня 2009

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

Но почему openGL не может использовать тот же самый тест глубины, который он всегда делает, чтобы выяснить, что находится дальше в обратном порядке, и сделать это для вас? Это просто ограничение фреймворка, или это связано с тем, что вы можете эффективно делать в графическом оборудовании, или что-то в этом роде?

Просто интересно. Надеюсь, что кто-то здесь может объяснить.

Ответы [ 3 ]

11 голосов
/ 27 июня 2009

Хороший вопрос.

Короткий ответ: Z-буфер хранит одно значение (только) для каждого пикселя в буфере кадра. Учитывая «обычный» режим работы (для непрозрачных объектов - GL_DEPTH_TEST включен, glDepthFunc установлен на GL_LESS), это значение будет глубиной ближайшего фрагмента, который отображается на этот пиксель.

Фрейм-буфер - это «тупое» устройство - каждый фрагмент растеризуется и тестируется на глубину независимо от всех остальных, и отделен от любой концепции производящего его примитива. Таким образом, нет места для хранения информации о предыдущих примитивах, сортировке по глубине и т. Д., Что потребуется для реализации функции «автоматической прозрачности».

Возможно, вы захотите заглянуть в «графы сцен» за помощью в сортировке по глубине. Это библиотеки, которые добавляют функциональность «более высокого уровня» по сравнению с базовыми функциями T & L, которые предоставляет OpenGL.

Надеюсь, это поможет.

3 голосов
/ 27 июня 2009

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

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

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

2 голосов
/ 27 июня 2009

Я не слышал об отключении проверки глубины. Требуется проверка глубины прозрачных объектов.

Вы просто не хотите, чтобы прозрачные объекты записывались в z-буфер, потому что тогда они пробивали бы дыры во всем, что было нарисовано впоследствии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...