Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KGiG_-_shpory.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6.14 Mб
Скачать

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

В традиционных языках программирования существуют функции и процедуры – т. е. можно выделить определенный набор команд, запом­нить его в некотором одном определенном месте и вызывать каждый раз, когда возникает потребность в соответствующей последовательности ко­манд. Подобная возможность существует и в OpenGL – набор команд OpcnGL можно запомнить в так называемый дисплейный список (display list), при этом все команды и данные переводятся в некоторое внутреннее представление, наиболее удобное для данной реализации OpenGL, и затем вызвать при помощи всего одной команды.

Каждому дисплейному списку соответствует некоторое целое число, идентифицирующее этот список.

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

void glNewList (GLuint list, GLenum mode),

void glEndList (),

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

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

Следует иметь в виду, что если в качестве параметра list списка используется уже существующий номер, то новый список не создается, а существующий список заменяется на новый.

Узнать, занят ли данный номер list каким-либо дисплейным списком, мож­но при помощи функции

GLboolean gllsList ( GLuint list )

Зарезервировать range свободных подряд идущих номеров для иденти­фикации дисплейных списков можно при помощи функции

GLuint glGenLists ( GLsizei range )

Эта функция возвращает первый свободный номер из блока зарезерви­рованных номеров данной командой.

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

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);

Замечание. Дисплейные списки нельзя изменять. Список можно уничтожить или создать заново. В дисплейном списке команды запоми­наются вместе со своими аргументами на момент передачи, так что в сле­дующем примере последний оператор присваивания дисплейный список не изменяет.

GLfloat color [] ={0.0, 0.0, 0.0 };

glNewList ( 1, GL.COMPILE );

glColor3fv ( color );

glEndList ();

color [2] = 1.0; // Не изменяет дисплейный список.

Не все команды OpenGL могут быть записаны в дисплейный список. К ним относятяся такие команды как glDeleteLists (), glFinish(), glGenLists () и некоторые другие.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]