Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Массивы вершин




Дисплейные списки

Если необходимо несколько раз обращаться к одной и той же группе команд, то их можно объединить в так называемый дисплейный список (display list), и вызывать его при необходимости. Для того, чтобы создать новый дисплейный список, надо поместить все команды, которые должны в него войти, между следующими операторными скобками:

 

void glNewList (GLuint list, GLenum mode)

void glEndList ().


Для различения списков используются целые положительные числа, задаваемые при создании списка значением параметра list, а параметр mode определяет режим обработки команд, входящих в список:

GL_COMPILE - команды записываются в список без выполнения;

GL_COMPILE_AND_EXECUTE - команды сначала выполняются, а затем записываются в список.

После того, как список создан, его можно вызвать командой

 

void glCallList (GLuint list),

 

указав в параметре list идентификатор нужного списка. Чтобы вызвать сразу несколько списков, можно воспользоваться командой

 

void glCallLists (GLsizei n, GLenum type, const GLvoid * lists),

 

вызывающей n списков с идентификаторами из массива lists, тип элементов которого указывается в параметре type. Это могут быть типы GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_INT, GL_UNSIGNED_INT и некоторые другие. Для удаления списков используется команда

 

void glDeleteLists (GLint list, GLsizei range),

 

которая удаляетсписки с идентификаторами ID из диапазона

list ≤ ID ≤ list + range -1.

 

Пример:

glNewList(1, GL_COMPILE);

glBegin(GL_TRIANGLES);

glVertex3f(1.0f, 1.0f, 1.0f);

glVertex3f(10.0f, 1.0f, 1.0f);

glVertex3f(10.0f, 10.0f, 1.0f);

glEnd();

glEndList()

glCallList(1);

 

Дисплейные списки в оптимальном, скомпилированном виде хранятся в памяти сервера, что позволяет рисовать примитивы в такой форме максимально быстро. В то же время большие объемы данных занимают много памяти, что влечет, в свою очередь, падение производительности. Такие большие объемы (больше нескольких десятков тысяч примитивов) лучше рисовать с помощью массивов вершин.

Если вершин много, то чтобы не вызывать для каждой команду

glVertex*(), удобно объединять вершины в массивы, используя команду

 

void glVertexPointer (GLint size, GLenum type, GLsizei stride, void* ptr),

 

которая определяет способ хранения и координаты вершин. При этом size определяет число координат вершины (может быть равен 2, 3, 4), type определяет тип данных (может быть равен GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE). Иногда удобно хранить в одном массиве другие атрибуты вершины, тогда параметр stride задает смещение от координат одной вершины до координат следующей; если stride равен нулю, это значит, что координаты расположены последовательно. В параметре ptr указывается адрес, где находятся данные.

Аналогично можно определить массив нормалей, цветов и некоторых других атрибутов вершины, используя команды:

 

void glNormalPointer (GLenum type, GLsizei stride, void * pointer);

void glColorPointer (GLint size, GLenum type, GLsizei stride, void * pointer).

 

Для того, чтобы эти массивы можно было использовать в дальнейшем, надо вызвать команду

 

void glEnableClientState (GLenum array)

 

с параметрами GL_VERTEX_ARRAY, GL_NORMAL_ARRAY, GL_COLOR_ARRAY соответственно. После окончания работы с массивом желательно вызвать команду

 

void glDisableClientState (GLenum array)

 

с соответствующим значением параметра array.

Для отображения содержимого массивов используется команда

 

void glArrayElement (GLint index),

 

которая передает OpenGL атрибутывершины, используя элементы массива с номером index. Это аналогично последовательному применению команд вида glColor*(…), glNormal*(…), glVertex*(…) c соответствующими параметрами. Однако вместо нее обычно вызывается команда

 

void glDrawArrays (GLenum mode, GLint first, GLsizei count),

 

рисующая count примитивов, определяемых параметром mode, используя элементы из массивов с индексами от first до first + count -1. Это эквивалентно вызову последовательности команд glArrayElement() с соответствующими индексами.

В случае, если одна вершина входит в несколько примитивов, то вместо дублирования ее координат в массиве удобно использовать ее индекс.

Для этого надо вызвать команду

 

void glDrawElements (GLenum mode, GLsizei count, GLenum type, void * indices),

 

где indices – это массив номеров вершин, которые надо использовать для построения примитивов, type определяет тип элементов этого массива: GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, а count задает их количество.

Важно отметить, что использование массивов вершин позволяет оптимизировать передачу данных на сервер OpenGL, и, как следствие, повысить скорость рисования трехмерной сцены. Такой метод определения примитивов является одним из самых быстрых и хорошо подходит для визуализации больших объемов данных.




Поделиться с друзьями:


Дата добавления: 2015-04-25; Просмотров: 456; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.