Алгоритм художника (также алгоритм сортировки по глубине и приоритетная заливка ) — это алгоритм для определения видимой поверхности в трехмерной компьютерной графике , который работает по принципу «полигон за полигоном», а не по принципу «пиксель за пикселем» , «строка за строкой» или «область за областью», как другие алгоритмы удаления скрытых поверхностей . [1] [2] [3] Алгоритм художника создает изображения, сортируя полигоны в изображении по их глубине и размещая каждый полигон в порядке от самого дальнего к самому близкому объекту. [4] [5]
Алгоритм художника был первоначально предложен в качестве базового метода решения проблемы определения скрытых поверхностей Мартином Ньюэллом , Ричардом Ньюэллом и Томом Санча в 1972 году, когда все трое работали в CADCentre . [4] Название «алгоритм художника» относится к технике, используемой многими художниками, когда они начинают с рисования удаленных частей сцены, прежде чем тех, которые находятся ближе, тем самым покрывая некоторые области удаленных частей. [6] [7] Аналогично, алгоритм художника сортирует все полигоны в сцене по их глубине, а затем рисует их в этом порядке, от самых дальних к самым близким. [8] Он закрасит части, которые обычно не видны, — таким образом решая проблему видимости — ценой закрашивания невидимых областей удаленных объектов. [9] Порядок, используемый алгоритмом, называется « порядком глубины» и не обязательно должен учитывать числовые расстояния до частей сцены: существенное свойство этого порядка заключается, скорее, в том, что если один объект закрывает часть другого, то первый объект рисуется после объекта, который он закрывает. [9] Таким образом, допустимый порядок можно описать как топологическое упорядочение направленного ациклического графа, представляющего преграды между объектами. [10]
Концептуально алгоритм Пэйнтера работает следующим образом:
сортировка полигонов по глубине для каждого полигона p : для каждого пикселя , который покрывает p : закрасить p.color на пикселе
Временная сложность алгоритма художника зависит от алгоритма сортировки, используемого для упорядочивания полигонов. При условии оптимального алгоритма сортировки, алгоритм художника имеет наихудшую сложность O ( n log n + m*n ), где n — количество полигонов, а m — количество пикселей для заполнения.
В худшем случае пространственная сложность алгоритма художника составляет O ( n+m ), где n — количество полигонов, а m — количество пикселей, которые нужно заполнить.
Существуют два основных технических условия, благоприятствующих использованию алгоритма художника.
Алгоритм художника не так сложен по структуре, как другие его аналоги алгоритма сортировки глубины. [9] [11] Такие компоненты, как порядок рендеринга на основе глубины, используемые алгоритмом художника, являются одним из самых простых способов обозначения порядка графического производства. [8] Эта простота делает его полезным в базовых сценариях вывода компьютерной графики, где несложный рендеринг должен быть выполнен с небольшими усилиями. [9]
В начале 70-х, когда был разработан алгоритм художника, физическая память была относительно небольшой. [12] Это требовало от программ максимально эффективного управления памятью для выполнения больших задач без сбоев. Алгоритм художника отдает приоритет эффективному использованию памяти, но за счет более высокой вычислительной мощности, поскольку все части всех изображений должны быть визуализированы. [9]
В некоторых случаях алгоритм может давать сбой, включая циклическое перекрытие или прокалывание полигонов.
В случае циклического перекрытия, как показано на рисунке справа, полигоны A, B и C перекрывают друг друга таким образом, что невозможно определить, какой полигон находится выше других. В этом случае проблемные полигоны должны быть отсечены, чтобы обеспечить сортировку. [4]
Случай пронзающих полигонов возникает, когда один полигон пересекает другой. Подобно циклическому перекрытию, эта проблема может быть решена путем разрезания проблемных полигонов. [4]
В базовых реализациях алгоритм художника может быть неэффективным. Он заставляет систему визуализировать каждую точку на каждом полигоне в видимом наборе, даже если этот полигон закрыт в готовой сцене. Это означает, что для детализированных сцен алгоритм художника может чрезмерно нагружать компьютерное оборудование.
Алгоритм Ньюэлла , предложенный как расширенный алгоритм алгоритма художника, предоставляет метод разрезания циклических и пронзающих многоугольников. [4]
Другой вариант алгоритма художника включает в себя алгоритм обратного художника . Алгоритм обратного художника сначала рисует объекты, ближайшие к зрителю — с правилом, что краска никогда не должна применяться к частям изображения, которые уже окрашены (если они не являются частично прозрачными). В компьютерной графической системе это может быть очень эффективно, поскольку нет необходимости рассчитывать цвета (используя освещение, текстурирование и т. п.) для частей удаленной сцены, которые скрыты близлежащими объектами. Однако обратный алгоритм страдает от многих из тех же проблем, что и стандартная версия.
Недостатки алгоритма художника привели к разработке методов Z-буфера , которые можно рассматривать как развитие алгоритма художника путем разрешения конфликтов глубины на попиксельной основе, что снижает необходимость в порядке рендеринга на основе глубины. [13] Даже в таких системах иногда используется вариант алгоритма художника. Поскольку реализации Z-буфера обычно полагаются на регистры буфера глубины с фиксированной точностью, реализованные в оборудовании, существуют проблемы с видимостью из-за ошибки округления. Это наложения или зазоры на стыках между полигонами. Чтобы избежать этого, некоторые графические движки реализуют «перерисовку», [ требуется цитата ] рисуя затронутые края обоих полигонов в порядке, заданном алгоритмом художника. Это означает, что некоторые пиксели фактически рисуются дважды (как в полном алгоритме художника), но это происходит только на небольших участках изображения и имеет незначительный эффект на производительность.
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь ){{cite journal}}
: Цитировать журнал требует |journal=
( помощь )