Современное программное обеспечение в таких областях как CAD, архитектурное моделирование и т.п. требует интерактивной визуализации динамических данных очень больших объемов, на порядки превосходящих возможности аппаратуры. Высокой скорости показа таких данных можно добиться с помощью поиска и удаление частей сцены, невидимых наблюдателю (в частности, перекрываемых поверхностей), таким образом, снижая нагрузку на графическую подсистему.
Задача удаления невидимых поверхностей является классической задачей компьютерной графики, и еще в 70-х годах было предложено значительное количество алгоритмов для ее решения. Удаление невидимых поверхностей основывается на том факте, что если пользователь не видит некоторый объект, то нет необходимости этот объект визуализировать, то есть визуализировать нужно только полностью или частично видимые объекты. Алгоритмы удаления невидимых поверхностей определяют невидимые для пользователя части сцены и не визуализируют их (удаляет из множества визуализируемых частей). На сегодняшний день можно считать базовую задачу решенной, а самым распространенным алгоритмом ее решения - алгоритм z-буфера, реализованный аппаратно. Краткое описание работы этого алгоритма дано в приложении.
Время работы z-буфера линейно относительно количества полигонов в сцене. Поэтому, использование одного только z-буфера не подходит для интерактивной визуализации современных сцен даже на самых мощных компьютерах. Таким образом, встает вопрос о разработке алгоритмов, которые бы быстро находили и отсекали пусть не всю, но значительную часть невидимой геометрии сцены, а уже все остальное можно было бы визуализировать с помощью z-буфера. У таких алгоритмов время работы, как правило, логарифмически зависит от количества полигонов в сцене.
В зависимости от характера удаляемой геометрии алгоритмы делятся на (1) алгоритмы, удаляющие поверхности, чьи нормали направлены от наблюдателя (задние грани объектов) (back-face culling), (2) алгоритмы, удаляющие полигоны, не попадающие в пирамиду видимости (view-frustum culling), и (3) алгоритмы, удаляющие перекрываемые поверхности (occlusion culling). Даже те поверхности, которые находятся в пределах пирамиды видимости и повернуты своими нормалями к наблюдателю, все равно могут быть не видны, поскольку могут перекрываться другими непрозрачными объектами, которые находятся ближе к точке наблюдения (примером может служить солнечное затмение или игра в прятки). Такие поверхности и называются перекрываемыми поверхностями. Чтобы их удалить, алгоритмы тем или иным образом выбирают поверхности, относительно которых затем производится проверка, являются ли другие поверхности видимыми. Такие поверхности называются перекрывающими поверхностями.
Важным понятием для алгоритмов удаления перекрываемых поверхностей является консервативность. Консервативный алгоритм всегда находит надмножество видимой геометрии - результатом его работы будет набор полигонов, включающий в себя все видимую геометрию и, по возможности, небольшое количество невидимой геометрии.
Целью алгоритмов удаления перекрываемых поверхностей является сведение стоимости визуализации сцены к сложности видимой части сцены. Идеально, алгоритм должен быть чувствительным к выводу - то есть время его работы должно быть пропорционально объему видимой геометрии.
В одной из первых работ на тему удаления перекрываемых поверхностей [8] авторы предложили алгоритм для работы с архитектурными сценами. На этапе предобработки алгоритм создает описывающую структуру, используя естественное разбиение сцены на комнаты - BSP дерево, где в качестве секущих плоскостей выступают стены комнат.
Для каждой комнаты, также во время предобработки, находится потенциально видимая геометрия (PVS - potential visible set) - другие комнаты, которые можно увидеть через дверные проемы (иначе называемые порталами), находясь в этой комнате. Потенциально видимыми являются комнаты, через которые проходят лучи, выпущенные из обрабатываемой комнаты и соединяющие последовательности порталов (Рис. 1.). Во время интерактивной работы со сценой алгоритм определяет положение наблюдателя и вычисляет, какие из потенциально видимых комнат, найденных заранее, попадают в пирамиду видимости. Геометрия, ассоциированная с этими комнатами, посылается на обработку в графическую подсистему для вывода ее на экран.

Данный алгоритм, вообще говоря, предназначен для работы с двумерными сценами, в которых стены комнат параллельны осям координат и его сложность сильно зависит от конфигурации комнат. В худшем случае она равна сложности z-буфера (когда все комнаты видны).
Существует расширение этого алгоритма для трехмерного случая [9].
Еще один алгоритм, предложенный в 1997 году [6], использует идею о том, что объект невидим наблюдателю, если он находится <в тени> некоторого другого объекта, то есть если принять положение наблюдателя за положение источника света и отбросить тень от перекрывающего объекта, то все объекты, попадающие в тень не освещены, то есть не видны наблюдателю. Рис. 2 иллюстрирует эту ситуацию.

На этапе предобработки алгоритм разбивает сцену на области с помощью иерархической структуры данных (в том числе это может быть восьмеричное дерево). Далее, с каждой областью разбиения ассоциируется набор потенциально хороших перекрывающих плоскостей. (Насколько <хороша> та или иная поверхность определяется по разным критериям, в том числе алгоритм стремится найти поверхности, за которыми находиться много других объектов на большом от него расстоянии). При интерактивной работе со сценой алгоритм определяет, в какой области находится наблюдатель, какие из потенциально хороших перекрывающих поверхностей попадают в пирамиду видимости и для каждой такой поверхности производит следующие действия:
В 1993 году в качестве расширения традиционного алгоритмы Z-буфера был предложен алгоритм иерархического Z-буфера [5] (Hierarchical Z-Buffer - HZB), использующий восьмеричное дерево при работе в объектом пространстве и Z-пирамиду при работе в экранном пространстве. Алгоритм производит обход восьмеричного дерева, начиная с вершины и для каждого узла (1) определяет, попадает ли он в пирамиду видимости, если да, то (2) определяет, видны ли грани куба, соответствующего этому узлу, и если видны, то (3) производит аналогичную обработку для дочерних узлов, вплоть до того, пока не будут достигнуты листья дерева, тогда (4) ассоциированная с ними геометрия выводиться на экран.
Для того чтобы быстро определять видимость граней кубов, соответствующих узлами дерева, используется Z-пирамида. Z-пирамида - это иерархия карт глубины. Каждый следующий уровень иерархии имеет разрешение в два раза меньше предыдущего и строиться на его основе. В качестве самого нижнего уровня выступает Z-буфер. Из каждой четверки соседних значений с нижнего уровня выбирается самое большое значение, то есть соответствующее самой далекой точке, и помещается в элемент следующего уровня. На Рис. 2. это проиллюстрировано для Z-буфера размером 4х4.

Определение видимости грани куба осуществляется следующим образом:
Поиск ближайшей точки грани для каждого исследуемого квадранта требует значительного времени, поэтому в заявленной авторами реализации алгоритм останавливается на втором шаге, и сразу после первого сравнения, если выясняется, что грань видна относительно этого уровня, производит растеризацию грани для точного определения ее видимости.
Алгоритм имеет логарифмическую сложность и основывается на возможности быстро выяснить, будет ли точка видима, если ее визуализировать. Для достижения интерактивной работы со сценой ответ на этот вопрос (z-readback) необходимо уметь получать с использованием аппаратных средств [12].
| Метод | 2D/3D | Консервативность | Перекрывающие поверхности | Предобработка | Необходимость в специфической аппаратной поддержке |
| Cells-and-Portals | 2D, 3D | Да | Стены комнат | Вычисление PVS | Нет |
| Shadow frusta | 3D | Да | Большие, выпуклые полигоны | Выбор перекрывающ-их поверхностей | Нет |
| HZB | 3D | Да | Все | Нет | Требуется z-readback |
В элементах массива, размерность которого соответствует разрешению экрана, содержатся значения координат z (глубины) визуализированных точек. Этот массив называется z-буфером. При растеризации новой точки, значение ее координаты z сравнивается с текущим значением в элементе массива с соответствующими координатами x, y. Если значение оказывается больше, т.е. точка находиться дальше, чем текущая точка в буфере, то ничего не происходит, если же оказывается, что значение координаты меньше, хранимого в массиве, т.е. точка находиться ближе, то значение элемента массива устанавливается равным новому значению глубины.
Для работы со сценами большой сложности часто используется восьмеричное дерево (octree). Алгоритм его построения дан ниже:
Недостатком второго подхода является увеличение количества примитивов в сцене. Обычно используют последний подход.
BSP (binary space partitioning) дерево может быть определено в любом измерении. Это бинарное дерево, где каждый узел представляет собой некоторую гиперплоскость, левое поддерево соответствует отрицательному подпространству этой гиперплоскости, а правое - положительному. Например, в двумерном случае каждый узел представляет собой линию, а поддерево - области на плоскости. BSP дерево является обобщением восьмеричного дерево, при котором секущие плоскости не должны проходит через центр разбиваемой области, и не должны быть параллельны координатным плоскостям (осям). Рис. 3. иллюстрирует пример построения BSP дерева. Буквами обозначены секущие плоскости, цифрами - области пространства.

Комментарии
Отправить комментарий