10.1. Пример программы OpenGl
Текст программы здесь представлен в виде двух файлов — winOpGL.cpp и studexso. срр. В этой программе использованы те же файлы ресурсов (studex.rc) и общего описания (studex.def), что и во всех предыдущих примерах программ.
Файл WinOpGL. срр:






Текст этой программы составлен их двух частей— winOpGL.cpp и studexso.срр. В файле WinOpGL.cpp сосредоточены функции, необходимые! для создания окна, оконные функции, функции инициализации графики. Этот^ файл будет использован и в следующих примерах программ OpenGL. Файл studexso. срр содержит текст, описывающий графическое отображение конкретных объектов (функция DrawMyExampieOpenGL). Как вы, наверное, уже за-
метили, все это подобно использованию в главах 5—8 наших собственных
файлов wiranain.cpp, winmainl.cpp И studexXX. cpp.
Запустите программу, затем выберите меню "Графика". На экране в окне программы появляется картинка, показанная на рис. 10.1.

Рис. 10.1. Первый пример OpenGL — двумерная графика
Изображение в окне программы studexso создается из нескольких графических примитивов. В данном случае рисовались точки, линии и полигоны. Вывод каждого такого примитива в OpenGL оформлен парой функций glBegin И glEnd:
![]()
Аргументом функции glBegin является код типа объекта.
Координаты вершины объекта задаются функцией givertexxx. Эта функция имеет много разновидностей (суффиксов хх). Отличия обусловлены типом и количеством аргументов givertex. Количество аргументов соответствует числу измерений систем координат. Тип координат-аргументов может быть целым или вещественным (с плавающей точкой) в нескольких разновидностях. Например:
![]()
задает двумерные вещественные координаты, а
![]()
задает также вещественные, но трехмерные координаты вершины.
Перечисление всех вершин объекта в программе завершает вызов функции glEnd. Это означает запись примитива в очередь графического вывода. В за-
висимости от аргумента функции giBegin(mode) список вершин может трак<; товаться OpenGL по-разному (табл. 10.1).
Таблица 10.1

Можно считать существенным недостатком ограничение для полигонов (glpolygon) возможностью вывода только выпуклых фигур. Функция API Windows Polygon в этом плане намного совершеннее — она рисует и невыпуклые полигоны. В OpenGL для рисования произвольных полигонов предусмотрена триангуляция.
Размер точек можно задать вызовом gipointsizeo, толщину линий — giLineWidth (). Для задания стиля линий используются функции glLineStipple, glEnable И glDisable, например:
glLineStipple(3, 0x08ff);
glEnable(GL_LINE_STIPPLE);
.... //здесь используется этот стиль линий
glDisable(GL_LINE_STIPPLE);
причем аргументами функции glLineStipple о являются количество повторов пикселов и шаблон пунктира.
Стиль заполнения фигур может быть задан растровым образцом в массиве 32x32 бит.
ения
Обратите
внимание,
мы уже несколько раз использовали
функцииglEnabie
() иgiDisable
(). Это многоцелевые функции. Они
предназначены для управления многими
разнообразными режимами отображения.
10.2. Координаты и матрицы
В OpenGL используются три типа матриц— видовая матрица, матрица проекции и матрица текстуры. Все они имеют размер 4x4 и определяют преобразования координат так, как описано в главе 2 этой книги.

Для задания 16 элементов матрицы можно использовать функции
![]()
которые копируют элементы массива т[ ] в текущую матрицу. Для некоторых часто используемых преобразований предусмотрены функции, которые автоматически заполняют значения коэффициентов. Функция giLoadidentityO устанавливает единичную матрицу текущего преобразования:

Следующие функции заполняют матрицы значениями коэффициентов, соответствующими таким преобразованиям:

Для того чтобы матрица определенного типа стала текущей, следует вызвать функцию glMatrixMode(mode), где значение mode = GL_MODELVIEW,
glprojection или gljtexture. Видовая матрица определяет преобразования мировых координат в координаты проецирования (видовые координаты). Матрица проекции отвечает за преобразование видовых координат проекции в экранные координаты. Матрица текстуры предназначена для наложения проективных текстур.
Для задания проекций отображения предусмотрены несколько функций. Аксонометрическая проекция (здесь называется ортографической) задается функциями giQrtho( ) или giuOrtho2D о. Центральная проекция устанавливается ВЫЗОВОМ функции gluPerspective ().
Для задания области отсечения графического вывода используется функция
glViewport().
