Дисплейные списки OpenGL
Руководитель Аппарата Исполнительного комитета г.Казани И.В.Сивов Новгородская область г. Боровичи, ул. Ленинградская д. 28 Реестровый номер ВНТ 011193 Тел/факс 8(81664) 201-89, 201-15 e-mail: turistbor@mail.ru
ГРАФИК АВТОБУСНЫХ ЭКСКУРСИОННЫХ ТУРОВ ЛЕТО 2015 13.06.15 Кронштадт «Город морской славы» 20.06.15 Любытино «Славянская деревня» 21.06.15г. Валдай «Уездный город» 27.06-28.06.15г. «Псковские жемчужины» Псков-Изборск-Печеры-Пушкинские горы (ночлег на б/о «Пушкиногорье») экскурсии и питание по программе 2 дня. 03.07-05.07.15г. «Русь святая» Нижний Новгород-Дивеево-Владимир-Суздаль (ночлег в гостинице Н. Новгород) экскурсии и питание по программе 3 дня. 04.07.15г. Петергоф «Дворцы и фонтаны» 05.07.15г. Кончанское Суворовское + купание на озере 11.07.-12.07.15 «Там на неведомых дорожках» Торжок-Берново-Осташков-Селигер-Нилова Пустынь-Исток Волги-Вышний Волочек (ночлег в Осташкове) 2 дня. 17.07-19.07.15г. «Дивные места Карелии» Петрозаводск-Заповедник Кивач- о. Кижи- Сортавала «Мраморный каньон» (ночлег в Петрозаводске) 3 дня. 18.07.15г. Кронштадт «Город морской славы» 25.07-26.07.15г. СПб. «День военно-морского флота» 2 дня. 25.07.15г. Любытино «Славянская деревня» + водопад 26.07.15г. Старая Русса «Краса Новгородчины» 01.08-02.08.15г. «Легенды старого Выборга» 2 дня. 01.08.15 Валдай «Уездный город» 08.08-09.08.15г. о. Валаам+ Сортавала «Мраморный каньон» целый день на о. Валаам (ночлег в Сортавале) 2 дня. 08.08.15г. Петергоф «Дворцы и фонтаны» 09.08.15. В. Новгород + теплоходная прогулка 14.08.-16.08.15. «Малое золотое кольцо России» Углич-Ростов-Переславль Залеский-Сергиев Посад (ночлег в Ростове и Переславле Залеском) 3 дня.
ПО ВЫХОДНЫМ ПОЕЗДКИ В ВАЛДАЙ: ИВЕРСКИЙ МОНАСТЫРЬ и ЛЕДОВЫЙ ДВОРЕЦ "КРИСТАЛ" (катание на коньках). 15.08.15г. Тихвин «История одного города» 22.08.15г. Пушкин-Павловск (парки, дворцы, янтарная комната) 23.08.15г. Православные святыни В. Новгорода (три монастыря) 29.08.15г. СПб. «Город на Неве» Подробная информация и запись по телефонам 8-(81664) 201-89, 201-15, 8- 950-681-10-83
Дисплейные списки OpenGL В компьютерных играх, одной из основных операций является отрисовка игровых персонажей и прочих объектов. Для этого может использоваться достаточно сложный алгоритм. Простые программы в методе, ответственном за обновление экрана просто повторяют отрисовку всех объектов. Вместо этого OpenGL предоставляет возможность один раз построить и отрисовать объект, и запомнить этот процесс в так называемом дисплейном списке. Тогда отрисовка будет вызывать просто одну функцию OpenGL, которая будет выполнять уже частично обработанные и кешированные команды, хранимых в специально отведенной памяти.
Создание дисплейного списка Чтобы создать дисплейный список нужно: 1. Cгенерировать и сохранить уникальный номер дисплейного списка 2. Между вызовами функций glNewList() и glEndList() единожды визуализировать необходимую графику 3. Теперь в функции, отвечающей за визуализацию кадра, достаточно вызвать необходимый дисплейный список с помощью команды glCallList
Список отображения (дисплейные списки) – это группа команд OpenGL, сохраненная для дальнейшего исполнения. Когда исполняется список отображения, команды, включенные в него, исполняются в том порядке, в котором они были заданы. Большинство команд OpenGL могут быть как сохранены в списке отображения, так и выполняться в непосредственном режиме, в котором они выполняются немедленно. В одной программе вы можете смело смешивать код непосредственного режима с использованием списков отображения. Во всех примерах программ до этого момента все команды исполнялись в непосредственном режиме.
РАБОТА СО СПИСКАМИ ИЗОБРАЖЕНИЙ В OpenGL предоставляется возможность объединять группу команд под определенным именем для последующего выполнения. Это обеспечивают списки изображений (дисплейные списки). Они подобны подпрограммам и являются удобным средством для кодирования больших систем со сложной иерархией. Список организуется командами: void glNewList (GLuint list, GLenum mode) void glEndList () Эти команды выглядят, как операторные скобки. Первая команда является заголовком (началом) нового списка изображений. Список заканчивается командой glEndList(). Параметр list представляет собой целочисленный идентификатор – имя списка. Параметр mode – символическая константа, определяющая следующие режимы сборки списка:
OpenGL компилирует список изображений только один раз, после этого он готов к применению. Поэтому мы получаем увеличение скорости при использовании списков изображений. Порядок, в котором команды располагаются в списке изображений, жестко определяют порядок, в котором они будут выполняться. Вызов списка изображений осуществляется командой: void glCallList (GLuint list) Параметр list задает целочисленное имя списка изображений. Рассмотрим пример подготовки и вызова списка изображений. … // Открываем список изображений (без выполнения) под номером 2 glNewList(2,GL_COMPILE); glColor3f(1.0f, 0.0f,0.0f); // Задаем цвет создаваемого примитива glBegin(GL_POLYGON); // Задаем сам примитив glVertex3f(1.0f, 1.0f, 0.0f); glVertex3f(–1.0f, 1.0f, 0.0f); glVertex3f(–1.0f, –1.0f, 0.0f); glVertex3f(1.0f, –1.0f, 0.0f); glEnd(); glEndList(); // Закрываем список изображений под номером 2 … glCallList(2); … В список можно включать вызовы уже готовых списков изображений. Рассмотрим список из двух вызовов готовых списков 1 и 2: … // Открываем список изображений (без выполнения) под номером 1 glNewList(1,GL_COMPILE); glColor3f(0.0f, 1.0f,0.0f); glBegin(GL_TRIANGLES); glVertex3f(1.0f, 2.0f, 0.0f); glVertex3f(–1.0f, 2.0f, 0.0f); glVertex3f(–1.0f, –2.0f, 0.0f); glEnd(); glEndList(); // Открываем список изображений (без выполнения) под номером 2 glNewList(2,GL_COMPILE); glColor3f(1.0f, 0.0f,0.0f); glBegin(GL_TRIANGLES); glVertex3f(1.0f, 1.0f, 0.0f); glVertex3f(–1.0f, –1.0f, 0.0f); glVertex3f(1.0f, –1.0f, 0.0f); glEnd(); glEndList(); // Открываем список изображений (без выполнения) под номером 3 glNewList(3,GL_COMPILE); glCallList(1); glCallList(2); glEndList(); … // Вызов списка 3 glCallList(3); … Для выполнения сразу нескольких готовых списков используется команда: void glCallList (GLsizei n, GLenum type, Const GLvoid *lists) где n – количество исполняемых списков, lists – указатель на массив, содержащий список имен списков изображений, которые необходимо исполнить, type – тип значений в списке имен lists и может принимать следующие символьные константы:
Перед вызовом команды glCallLists можно задать постоянное смещение к каждому имени списка изображения из массива lists. Это выполняется командой void glListBase (GLuint base) где base – целочисленное смещение. По умолчанию это смещение равно нулю. Как уже было показано в примере, команды glCallList и glCallLists могут быть вложены в другие списки изображений. Уровней вложения не может быть больше 64. При работе со списками, особенно при формировании шрифтов, приходится следить за номерами создаваемых списков, что не всегда удобно. Эту проблему легко разрешает функция glGenList, генерирующая непрерывный набор пустых дисплейных списков. Рассмотрим формат записи этой команды. GLuint glGenList (GLsizei range) Параметр range определяет количество пустых дисплейных списков, которые необходимо сгенерировать. Функция glGenList возвращает целое число n, которое является именем первого дисплейного списка. Если range больше 1, то также будут созданы пустые дисплейные списки с именами n+1, n+2,…, n+range−1. При нулевом значении range функция glGenList вернет значение 0 и никакой дисплейный список не создастся. В ходе выполнения программы можно удалять непрерывную группу имен списков изображений. Допустим, имеется группа имен, например: 1, 3, 4, 5, 6, 8, 9, 10. Мы можем удалить из этой группы любую непрерывную последовательность имен списков, например, 4, 5 и 6. Для этого необходимо воспользоваться специальной командой void glDeleteLists (GLuint list, GLsizei range) где list – целое число, являющееся именем первого удаляемого списка изображений, range – количество удаляемых списков. Для приведенного выше примера, оформление команды glDeleteLists выглядит следующим образом: glDeleteLists(4,3). Ход работы: 1. Нарисовать коробок спичек, используя дисплейные списки. 2. На каждый объект коробки спичек (в том числе и сами спички) наложить текстуру. 3. К нарисованному объекту применить: · Поворот; · Масштабирование; · Перенос; · Каркас объекта; · Обрезка объекта; · Выдвижение/задвижение внутренней части короба. 4. Запрограммировать освещение объекта, используя создание источника света (возможность включения/выключения света).
|