
- •1. Цели и задачи компьютерной графики
- •2. Растровая и векторная визуализация изображений. Основные характеристики растровых изображений
- •3. Аддитивная цветовая модель rgb. Кодирование цвета. Палитра
- •4. Графические форматы. Работа с растровыми изображениями (форматы ddb, dib, bmp-файлы)
- •5. Понятие об инкрементных алгоритмах растеризации. Растровое представление отрезка. Вывод и реализация алгоритма
- •6. Понятие об инкрементных алгоритмах растеризации. Построение окружности методом средней точки. Вывод и реализация алгоритма
- •7. Стиль линии (перо). Алгоритм вывода линии
- •8. Стиль заполнения, кисть, текстура
- •9. Геометрические основы компьютерной графики. Системы координат (декартова, полярная, сферическая) и векторы. Скалярное и векторное произведение векторов
- •11. Построение кривых. Интерполяционный полином Лагранжа. Достоинства и недостатки. Реализация
- •12. Построение кривых. Интерполяционный кубический сплайн. Реализация
- •13. Построение кривых. Геометрические сплайны. Кривая Безье. Геометрический алгоритм построения кривой Безье. Реализация
- •14. Мировые и экранные координаты. Алгоритм пересчёта мировых 2d-координат в оконные. Вывод и реализация
- •15. Физическая и логическая системы координат. Режимы отображения (без настройки параметров). Алгоритм преобразования координат в gdi и его связь с алгоритмом пересчёта мировых координат в оконные
- •16. Режимы отображения и настройка их параметров (функции класса cdc mfc). Функция SetMyMode, назначение, параметры и реализация
- •17. Аффинные преобразования на плоскости. Преобразование системы координат: смещение, растяжение-сжатие, поворот
- •18. Аффинные преобразования на плоскости. Преобразование объектов: смещение, растяжение-сжатие, поворот
- •19. Аффинные преобразования в пространстве. Преобразование системы координат: смещение, растяжение-сжатие, повороты вокруг осей координат
- •20. Аффинные преобразования в пространстве. Преобразования объектов: смещение, растяжение-сжатие, повороты вокруг осей координат
- •21. Основные типы проекций. Видовая система координат (вывод матрицы преобразования)
- •22. Перспективные преобразования (вывод матрицы преобразования). Схема пересчёта координат при переходе от мировых 3d-координат к экранным
- •23. Модели описания поверхностей
- •24. Каркасная визуализация трёхмерных изображений. Принцип удаления невидимых граней для выпуклого многогранника. Реализация
- •30. Графическая библиотека OpenGl. Структура glut-приложения. Пример
- •31. Графическая библиотека OpenGl. Рисование графических примитивов. Дисплейные списки. Удаление нелицевых граней. Вывод текста. Примеры
- •Вершины и примитивы
- •Положение вершины в пространстве
- •Цвет вершины
- •Нормаль
- •Операторные скобки glBegin / glEnd
- •Дисплейные списки
- •Массивы вершин
- •32. Графическая библиотека OpenGl. Системы координат. Модельно-видовые преобразования. Примеры
- •Матрицы
- •Модельно-видовые преобразования
- •33. Графическая библиотека OpenGl. Проекции. Область вывода. Создание анимации. Примеры
- •Область вывода
- •Создание анимации в OpenGl
- •34. Графическая библиотека OpenGl. Материалы и освещение. Примеры
- •Модель освещения
- •Описание источников света
- •35. Графическая библиотека OpenGl. Структура приложения с использованием библиотеки mfc
Дисплейные списки
В традиционных языках программирования существуют функции и процедуры – т. е. можно выделить определенный набор команд, запомнить его в некотором одном определенном месте и вызывать каждый раз, когда возникает потребность в соответствующей последовательности команд. Подобная возможность существует и в 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 () и некоторые другие.
Дисплейные списки в оптимальном, скомпилированном виде хранятся в памяти сервера, что позволяет рисовать примитивы в такой форме максимально быстро. В то же время большие объемы данных занимают много памяти, что влечет, в свою очередь, падение производительности. Такие большие объемы (больше нескольких десятков тысяч примитивов) лучше рисовать с помощью массивов вершин.