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

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

Массив вершин можно сохранять на сервере с помощью новых функций API, появившихся в версии OpenGL 1.5. При этом рендеринг будет выполняться быстрее, так как данные могут быть сохранены в память графического ускорителя, в результате чего не будут каждый раз передаваться через шину ввода-вывода для рендеринга. OpenGL API позволяет также эффективно передавать дани ые с клиента на сервер посредством специальных буферных объектов. Буферный объект создастся командой glBi ndBuffer и заполняется командами gl Bu fferData и gl BufferSubData. Для заполнения буфера также можно использовать команду glMapBuffer, которая отображает буфер в адресное пространство клиента и возвращает указатель на клиентскую область памяти. (Этот указатель можно использовать для непосредственного доступа к содержимому буфера.) "Перед рендерингом обязательно нужно вызвать gl Unmap-Buffer. Команда gl Bi ndBuf fer используется также для привязки состояния к текущему буферу. Например, если текущим буфером является «нулевой» буфер1, то команды gl Col orPoi nter, gl Normal Рот nter, gl VertexPoi nter и др. интерпретируют переданный им указатель как указатель на память на стороне клиента. Если был связан какой-либо буфер (ненулевое значение), переданный указатель интерпретируется как смещение внутри текущего буфера. Поэтому последовательные вызовы одной из команд рисования из массивов вершин (например, gl Mul ti DrawArrays) могут получать данные либо с клиентской, либо с серверной памяти, либо из обеих.


⇐ вернуться назад | | далее ⇒