Введение в OpenGL Алексей Игнатенко Обзор OpenGL и GLUT Обзор OpenGL и GLUT • Что такое OpenGL и что он дает мне? • OpenGL в оконных средах • Почему GLUT • Шаблон GLUT-программы Что такое OpenGL? • API для визуализации графики • Вывод цветных изображений высокого качества, составленных из геометрических и других примитивов • Независимость от оконной системы • Независимость от операционной системы Архитектура OpenGL CPU Polynomial Evaluator Per Vertex Operations & Primitive Assembly Display List Rasterization Pixel Operations Texture memory Per Fragment operations Frame Buffer OpenGL как Визуализатор •Геометрические примитивы • Точки, линии, полигоны •Изображения как примитивы • Изображения и битовые карты • Разделенные конвейеры для изображений и геометрии – Связанные через текстурирование •Визуализация зависит от состояния (state) • Цвета, материалы, источники света и т.д Сопутствующие API •AGL, GLX, WGL • Связь между OpenGL и оконной системой •GLU (OpenGL Utility Library) • Часть OpenGL • NURBS, tessellators, quadric shapes, etc •GLUT (OpenGL Utility Tookkit) • Переносимый оконный API • Неофициальная часть OpenGL OpenGL и сопутствующие API Application program OpenGL motif widget or similar GLUT GLX, AGL or WGL GLU X, Win32, Mac OS Software and/or hardware GL Начальные cведения • Заголовочные файлы • #include <GL/gl.h> • #include <GL/glu.h> • #include <GL/glut.h> • Библиотеки • Перенумерованные типы • OpenGL определяет перенумерованные типы для совместимости – GLfloat, GLint, GLenum и т.д Основы работы с GLUT •Структура приложения • Настроить и открыть окно • Инициализировать состояние OpenGL • Зарегистрировать callback – функции – Визуализация – Изменение размера – Ввод: клавиатура, мышь и т.д • Запустить цикл обработки событий Пример программы void { main (int argc, char ** argv) Int mode = GLUT_RGB | GLUT_DOUBLE; glutInitDisplayMode ( mode ); glutCreateWindow( argv[0] ); init(); glutDisplayFunc ( display ); glutReshapeFunc ( resize ); glutKeyboadFunc ( key ); glutIdleFunc ( idle ); glutMainLoop(); } Инициализация OpenGL • Установите нужные состояния для всего, что вы собираетесь использовать void init ( void) { glClearColor( 0.0, 0.0, 0.0, 1.0); glClearDepth( 1.0 ); glEnable( GL_LIGHT0); glEnable( GL_LIGHTING); glEnable( GL_DEPTH_TEST); } Функции обратного вызова • Процедуры, которые вызываются, когда что-нибудь происходит • Изменение размеров окна • Пользовательский ввод • Анимация •«Регистрация» функции обратного вызова в GLUTe glutDisplayFunc( display ); glutIdleFunc( idle ); glut KeyboardFund( keyboard ); Callback-функция визуализации • Рисуйте все здесь: glutDisplayFunc( display ); void display( void ) { glClear (GL_COLOR_BUFFER_BIT); glBegin( GL_TRIANGLES); glVertex3fv( v[0] ); glVertex3fv( v[1] ); glVertex3fv( v[2] ); glEnd(); glutSwapBuffers(); } Callback-функция ожидания •Используйте для анимации glutIdleFunc ( idle ); void idle ( void ) { T + = dt; glutPostRedisplay(); } Callback-функция пользовательского ввода •Обработка ввода пользователя glutKeyboardFunc ( keyboard ); void keyboard ( char key, int x, int y) { switch ( key ) { case ‘q’: case ‘Q’ : exit ( EXIT_SUCCESS ); break; case ‘r’ : case ‘R’: rotate = GL_TRUE; break; } } Основы рендеринга с помощью OpenGL Основы рендеринга с помощью OpenGL • Геометрические примитивы • Управление состоянием OpenGL • Буферы OpenGL Геометрические примитивы GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_TRIANGLES GL_POLIGON GL_QUADS GL_QUAD_STRIPE GL_TRIANGLE_STRIP GL_TRIANGLE_FAN Простой пример void drawRhombus ( Glfloat color[]) { glBegin( GL_QUADS ); glColor3f( color ); glVertex2f( 0.0, 0.0 ); glVertex2f( 1.0, 0.0 ); glVertex2f( 1.5, 1.118 ); glVertex2f( 0.5, 1.118 ); glEnd(); } Формат команд OpenGL glVertex3fv ( v ) Тип данных Число компонент 2 – (x, y) 3 – (x, y, z) 4 – (x, y, z, w) B ub s us I ui f d – byte – unsigned byte – short – unsigned short – int – unsigned int – float – double Вектор «v» отсутствует для скалярных форм glVertex2f(x,y) Определение примитивов OpenGL •Примитивы определяются, используя: glBegin( prim_type ); glEnd(); •prim_type определяет, каким образом будут комбинироваться вершины OpenGL как конечный автомат •Все атрибутот, используемые для рендеринга, составляют текущее состояние OpenGL • Стили рендеринга • Затенение • Освещение • Наложение текстуры Управление состоянием •Внешний вид определяется состоянием for each (primitive to render) { update OpenGL state render primitive } •Манипулирование атрибутами вершин –наиболее общий способ изменения состояния • glColor* () glNormal* () glTexCoord* () Управление состоянием •Установка состояния • glPointSize( size ); glShadeModel ( GL_SMOOTH ); glColor3fv ( color ); •Включение и выключение функциональности • glEnable( GL_LIGHTING ); glDisable( GL_DEPTH_TEST ); Преобразования в OpenGL Преобразования в OpenGL •Модельное преобразования •Видовые преобразования • Ориентация камеры • Проекция на плоскость камеры • Перевод в систему координат устройства Виртуальная камера Видимый объем Камера Штатив Модель Виртуальная камера и преобразования • Преобразование проекции • Настройка линз камеры • Видовое преобразование • Изменение положения камеры в пространстве • Модельное преобразование • Изменение положения модели в пространстве • Оконные (viewport) преобразования • Изменение размеров готовой фотографии Координатные системы и преобразования • Шаги для формирования изображения • Определение геометрии (мировая системы координат) • Определение камеры (видовая система координат) • Проецирование (оконная система координат) • Перевод в экранные координаты (экранная система координат) • Каждый шаг использует преобразования • Каждая трансформация эквивалентна изменению системы координат Афинные преобразования • Преобразования, сохраняющие геометрию • Линии, полигоны, … • Аффинное = сохраняющее линии • Поворот, смещение, изменение масштаба • Проекция • Конкатенация ( композиция ) Однородные координаты • Каждый вектор – столбец • w обычно 1.0 • Все операции – матричные умножения • Направления могут быть представлены с w = 0.0 3D преобразования • Каждая вершина транформируется с помощью матриц 4x4 • Все аффиные операции – умножения матриц • Все матрицы хранятся построчно в OpenGL Определение преобразований в OpenGL • Программист имеет два стиля определения преобразований • Определяя матрицы (glLoadMatrix, glMultMatrix) • Определяя операции (glRotate, glOrtho) • Программист не обязан помнить точные формулы для вычисления матриц Конвейер преобразований object eye clip vertex Modelview matrix Projection matrix Modelview Projection Modelview … normalized Perspective division window Viewport transform Модельные преобразования •Перемещение объекта • glTranslate{fd} (x, y, z) •Поворот объекта вокруг произвольных осей • glRotate{fd} (angle, x, y, z) •Изменение масштаба объекта • glScale{fd} (x, y, z) Проекции • Форма пирамиды зрения •Перспективная проекция • gluPerspective ( fovx, aspect, zNear, zFar) •Ортогональная проекция • glOrtho(left, right, bottom, top, zNear, zFar) Применение преобразований проекции •Типичное использование glMatrixMode ( GL_PROJECTION ); glLoadIdentity (); glOrtho ( left, right, bottom, top, zNear, zFar) Видовые преобразования • Установка «штатива» камеры, настройка объектива • Чтобы «летать» по сцене • Задать видовое преобразование и перерисовать сцену • gluLookAt( eyex, eyey, eyez, aimx, aimy, aimz, upx, upy, upz) Связь между модельным и видовыми преобразованиями • Перемещение камеры = перемещение каждого объекта по отношению к фиксированной камере. • Видовое преобразование эквивалентно нескольким модельным преобразованиям. Левая и правая системы координат • Преобразования проекции используют левую систему координат • Znear и Zfar – просто расстояния от точки зрения • Во всех остальных случаях OpenGL использует правую систему координат y y z+ левая правая x x z+ Resize() : Perspective & LookAt void Resize( int w, int h) { glViewport ( 0, 0, (sizei) w, (sizei) h); glMatrixMode( GL_PROJECTION ); glLoadIdentity (); gluPerspective ( 65.0, (Glfloat) (w / h), 1.0, 100.0); glMatrixMode(GL_MODELVIEW); gluLookAt( 0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ); } Освещение Принципы освещения • Составляющие модели освещение OpenGL • Материал объекта определяет его своейста его поверхности • Цвет и положение источника света • Глобальные параметры освещения – рассеянный свет Модель Фонга ambient = Ka, diffuse = Kd * cos(N, L), specular = Ks * (cos (R, V)) Ns intensity = ambient + amp * (diffuse + specular). Как устроено освещение в OpenGL • Модель Фонга • Вычисляется на вершинах • Составляющие модели освещения • Свойства материала поверхности • Свойства источника света • Свойства модели освещения Свойства материала •Определение свойств материала для примитива glMaterialfv (face, property, value) GL_DIFFUSE GL_SPECULAR GL_AMBIENT GL_EMISSION GL_SHININESS Свойства источника света glLightfv ( light, property, value ) • цвет источника • положение • затухание Типы источников света • OpenGL поддерживает два типа источников света • Локальные (точечные) источники • Бесконечно удаленные (параллельные) источники • Тип определяется координатой w • w = 0 параллельный источник • W 0 точечный источник (x / w, y / w, z /w)