Преимущества использования Z-буфера по сравнению с приоритетами пикселей в зависимости от глубины - PullRequest
2 голосов
/ 24 марта 2011

Это немного больше академического вопроса. На самом деле я готовлюсь к экзамену и просто пытаюсь по-настоящему понять эту концепцию.

Позвольте мне немного объяснить контекст. Проблема в том, чтобы при рисовании на экране скрывать объекты (или, более конкретно, многоугольники) друг за другом. Необходимо сделать расчет, чтобы решить, какой из них будет нарисован последним и, следовательно, на первый план.

На лекции, на которой я был на днях, мой профессор заявил, что расстановка приоритетов пикселей с точки зрения их значения глубины неэффективна в вычислительном отношении. Затем он дал нам краткое объяснение Z-буферов и того, как они проверяют значения глубины пикселей и сравнивают их со значениями глубины пикселей в буфере. Чем это отличается от «приоритетов пикселей с точки зрения их глубины».

Спасибо!

Ответы [ 2 ]

6 голосов
/ 24 марта 2011

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

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

Это - то, где z-буфер входит. Если оказывается, что вычисленная глубина фрагмента больше, чем то, что уже сохранено в z-буфере, это означает, что фрагмент находится «позади чего-то», поэтому он отбрасывается. В противном случае фрагмент записывается в цветной буфер, а значение глубины записывается в z-буфер. Конечно, это означает, что, когда 20 треугольников находятся позади друг друга, один и тот же пиксель будет затенен 19 раз напрасно. Увы, невезение.

Современное графическое оборудование решает эту проблему, выполняя z-тест до фактического затенения пикселя в соответствии с интерполированной глубиной вершин треугольника (эта оптимизация, очевидно, невозможна , если глубина пикселя рассчитывается).

Кроме того, они используют консервативные (иногда иерархические, иногда просто мозаичные) оптимизации, которые быстро отбрасывают целые группы фрагментов. Для этого z-буфер содержит некоторую дополнительную (неизвестную вам) информацию, такую ​​как, например, максимальная глубина, отображаемая в прямоугольной области 64x64. С помощью этой информации он может немедленно отбросить любые фрагменты в этой области экрана, которые больше этого, без фактического просмотра сохраненных глубин, и он может полностью отбросить любые фрагменты, принадлежащие треугольнику, у которого все вершины имеют большую глубину. Потому что, очевидно, нет никакой возможности, чтобы что-либо из этого могло быть видимым.
Это подробности реализации и очень зависит от платформы.

РЕДАКТИРОВАТЬ: Хотя это, вероятно, очевидно, я не уверен, что я достаточно ясно прояснил этот момент: при сортировке для использования z-culling, вы бы сделали прямо противоположное того, что вы делаете с художником. алгоритм. Вы хотите, чтобы самые близкие вещи были нарисованы первыми (грубо говоря, не обязательно должны быть на 100% точными), поэтому вместо того, чтобы определять конечный цвет пикселя в смысле «последний стоящий человек», вы получаете его в смысле «первым пришел, первым служил, и только один служил ".

3 голосов
/ 24 марта 2011

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

...