Главная » 3D графика » OpenGL – что дальше ?

RSS

OpenGL – что дальше ?

Оптимизация передачи геометрических данных

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

Для минимизации избыточности информации о вершинах в OpenGL определяются два геометрических примитива: веер треугольников (triangle fan) и полоска треугольников (triangle strip). В этих примитивах вершины, принадлежащие общим ребрам соседних треугольников, представляются однократно. Поэтому геометрия N треугольников задается всего N+2 вершинами, что существенно меньше 3*N, если треугольники описаны независимо.

Компактное представление треугольников особенно полезно для триангулированных NURBS-поверхностей – веерные структуры наиболее подходят в местах обрыва поверхностей (например, возле отверстия в пластине), а внутренние области хорошо покрываются полосками. Вееры и полоски треугольников взаимодополняют друг друга: алгоритмы для построения первых хорошо работают там, где плохо строятся вторые, и наоборот. Генерация вееров – более простая задача: в качестве хорошего кандидата на роль начальной вершины, как правило, годится любая вершина, в которую входит большое число ребер. В состав OpenGL Optimizer входят три класса, соответствующие трем способам упаковки треугольников: генератор вееров, генератор полосок и их комбинация.Opengl ES 2.0

Работа с веерами и полосками требует известной аккуратности ведь вершина OpenGL – это не только координаты, но и атрибуты: нормаль, цвет и т.д. Вершины смежных треугольников могут иметь одинаковые координаты, но различные наборы атрибутов. В OpenGL двусмысленность вершин в компактном представлении устраняется следующим образом каждая вершина получает атрибуты, соответствующие первому треугольнику, в который она входит, а все последующие атрибуты теряются.

Алгоритмы генерации вееров и полосок в OpenGL Optimizer действуют более точно. Для генераторов компактных примитивов можно определить максимально допустимую разницу между атрибутами вершины в добавляемом треугольнике и наследуемыми атрибутами, и тем самым проконтролировать приемлемую степень нарушений в изображении. Чтобы понять, насколько это важно, рассмотрим случай двух прилегающих треугольников, которые лежат на двух смежных гранях куба. Правильные нормали разделяемых вершин на общей грани куба ортогональны друг другу. Если рассматриваемые треугольники сгруппировать в полоску, то один из них будет изображаться как криволинейная поверхность по той причине, что оригинальные нормали его разделяемых вершин не будут учитываться при расчете освещенности.

Поддержка сложных поверхностей

Простота и эффективность процесса создания геометрических моделей в большей мере зависит от набора примитивных элементов, которыми располагает конструктор. Если базовый набор ограничен, как в OpenGL, сферой, конусом, цилиндром, то придется приложить усилия, вырезая из них подходящие куски и склеивая их друг с другом. Для того, чтобы быстро строить поверхности с большим числом выпуклостей и вогнутостей, требуются примитивы, которые описываются математически как полиномы высокого порядка. Тогда сложную поверхность можно построить одним махом – подобрав коэффициенты полинома.

OpenGL Optimizer поддерживает большое количество типов кривых и поверхностей высокого порядка, использующихся на практике в распространенных CAD системах:плазовые поверхности;

  • билинейные поверхности Куна;
  • поверхности общего вида, получаемые натягиванием на образующие;
  • Эрмитовы сплайновые поверхности;
  • неоднородные рациональные B-сплайновые поверхности (NURBS).

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

Топология модели

В моделях CAD абстрактные математические поверхности не более, чем строительный материал. Путем усечения из них выбираются подходящие по форме куски, которые сопрягаются друг с другом. Для многих алгоритмов обработки модели важно, чтобы условия стыковки поверхностей (тождественность линий-швов, общих вершин) были заданы точно, а чисто геометрической информации – координат точек – для этого мало. Явные стыковочные ограничения называются топологией поверхности модели. Наличие топологических данных критически важно, например, для триангуляции и особенно, когда строится разбиение с небольшим числом полигонов. Топологическая информация может быть либо получена от вызвавшей OpenGL Optimizer прикладной системы, либо выведена им самостоятельно по технологии Topology Synthesis.

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

Страницы : 1 2 3 4 5 6

Таги: ,