преобразования

advertisement
Введение в 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)
Download