Второй метод рисования примитивов основан на использовании массивов вершин. Приложения помещают атрибуты вершин в массивы, запоминают указатели на эти массивы и используют gl DrawArrays, glMultiDrawArrays, glDrawEl ements, glMul ti DrawEI ements, gl DrawRangeEl ements или gl Inter! eavedArrays для рисования большого количества примитивов за один раз. Этот метод предпочтительнее, если для приложения критична производительность, - упомянутые функции эффективно передают большое количество данных в OpenGL, g 1 Beg 1 n/gl End-методы требуют вызова функции для каждого атрибута каждой вершины, так что из-за множественных вызовов функций при рисовании объектов с тысячами вершин время выполнения существенно увеличивается, в то время как использование массивов вершин позволяет обойтись всего одним вызовом. Ко всему прочему предварительная организация данных в массивы позволяет реализациям OpenGL использовать более эффективные алгоритмы для их обработки.

Текущий массив значений цвета можно указать функцией glColorPointer, текущий массив координат вершин - функцией gl VertexPoi nter, текущий массив векторов нормали - функцией gl Normal Pointer и т. д. Функция gl Inter! eavedArrays может работать одновременно с несколькими каким-то образом соотносящимися друг с другом массивами (например, каждая вершина должна быть онределеиа тремя числами, представляющими нормаль, и тремя числами, представляющими координаты вершины).

После Л' нылоион gIVertex количсстно треутдышшв, входящих н примітні, будет рацио Л' - 2. При этом каждый и-й вызов gl Vertex определяет треугольник со следующими нершинамм: для нечет-пых я - с номерами п, п + 1, п + 2; для четных я - с номерами п + 1, п, п + 2. - Примеч. перев.

1.7. Рисование геометрических фигур

Предыдущие два метода являются методами непосредственного режима, так как примитивы обрабатываются сразу же, как только приходит информация о них. Используя третий метод, можно сохранить последовательность вызовов функций как для единичных вершин, так и для массивов в дисплейном списке (так называется структура данных, управляемая OpenGL, в которой команды ожидают своего выполнения). Дисплейные списки могут включать в себя и команды для установки состояния, и команды рисования. Они хранятся на сервере и могут быть обработаны позже вызовами glCal'IList или glCallLists. Этот альтернативный способ передачи данных не показан на рис. 1.1, но тоже является частью последовательности обработки данных в OpenGL. Определение дисплейного списка начинается вызовом glNewList и завершается вызовом gl EndLi st. Все команды, находящиеся между этими двумя вызовами, сохраняются в дисплейном списке (хотя некоторые из команд OpenGL вообще не могут быть сохранены там). В некоторых реализациях режим дисплейного списка может дать преимущество в скорости выполнения по сравнению с непосредственным режимом, так как последовательность команд в списке может быть оптимизирована под конкретное аппаратное обеспечение, на котором она будет выполнена. При этом команды могут сохраняться там, где обеспечивается лучшая производительность, иногда даже в памяти графического ускорителя. Для того чтобы, применяя этот метод, действительно получить преимущество в производительности, нужно использовать созданный дисплейный список более чем один раз, так как при формировании списка и оптимизации требуются дополнительные вычисления и перемещения данных.


⇐ Предыдущая| |Следующая ⇒