Алгоритм художника ( также алгоритм сортировки по глубине и приоритетная заливка ) — это алгоритм определения видимой поверхности в трехмерной компьютерной графике , который работает на основе полигона за полигоном , а не попиксельно , построчно или по площади. базис площади других алгоритмов удаления скрытых поверхностей . [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=
( помощь )