OpenGL API Алексей Игнатенко (MSU Graphics & Media Lab) Алексей Игнатенко (MSU Graphics & Media Lab)
Сегодня на лекции Обзор архитектуры OpenGLОбзор архитектуры OpenGL МатериалыМатериалы ОсвещениеОсвещение Работа с текстурамиРабота с текстурами Пиксельные операцииПиксельные операции –смешивание –альфа-тест Обзор архитектуры OpenGLОбзор архитектуры OpenGL МатериалыМатериалы ОсвещениеОсвещение Работа с текстурамиРабота с текстурами Пиксельные операцииПиксельные операции –смешивание –альфа-тест
Архитектура OpenGL
Архитектура OpenGL (2) Два конвейера: Обработка вершин (геометрических примитивов)Обработка вершин (геометрических примитивов) –Точки, линии, многоугольники Обработка пикселей и изображенийОбработка пикселей и изображений Текстурирование объединяет два типа примитивов Два конвейера: Обработка вершин (геометрических примитивов)Обработка вершин (геометрических примитивов) –Точки, линии, многоугольники Обработка пикселей и изображенийОбработка пикселей и изображений Текстурирование объединяет два типа примитивов
Операции OpenGL Типичные операции Нарисовать что-либоНарисовать что-либо Изменить способ рисованияИзменить способ рисования Типичные операции Нарисовать что-либоНарисовать что-либо Изменить способ рисованияИзменить способ рисования
Материалы Свойства материала glMaterialfv(face, property, value)glMaterialfv(face, property, value) Свойства материала glMaterialfv(face, property, value)glMaterialfv(face, property, value) GL_DIFFUSE Базовый цвет объекта GL_SPECULAR Цвет блика GL_AMBIENT Цвет без освещения GL_EMISSIONСвечение GL_SHININESS Гладкость поверхности
Освещение Определение источников света: glLightfv( light, property, value ); Light – номер источника света начиная с GL_LIGHT0Light – номер источника света начиная с GL_LIGHT0 Property – параметрыProperty – параметры –Цвета –Положение и тип –Затухание Определение источников света: glLightfv( light, property, value ); Light – номер источника света начиная с GL_LIGHT0Light – номер источника света начиная с GL_LIGHT0 Property – параметрыProperty – параметры –Цвета –Положение и тип –Затухание
Цвета источника света Цвет источника GL_AMBIENTGL_AMBIENT GL_DIFFUSEGL_DIFFUSE GL_SPECULARGL_SPECULAR Цвет источника GL_AMBIENTGL_AMBIENT GL_DIFFUSEGL_DIFFUSE GL_SPECULARGL_SPECULAR
Типы источников света OpenGL поддерживает два типа источников: Точечные (локальные) источникиТочечные (локальные) источники Направленные (бесконечно удаленные)Направленные (бесконечно удаленные) Тип источника света контролируется значением координаты w (x, y, z, w): w = 0 направленный источникw = 0 направленный источник w = 1 точечный источникw = 1 точечный источник OpenGL поддерживает два типа источников: Точечные (локальные) источникиТочечные (локальные) источники Направленные (бесконечно удаленные)Направленные (бесконечно удаленные) Тип источника света контролируется значением координаты w (x, y, z, w): w = 0 направленный источникw = 0 направленный источник w = 1 точечный источникw = 1 точечный источник Пример
Определение положения источника света Модельно-видовая матрица влияет на положение источника света Разные эффекты в зависимости от того, когда определяется источник светаРазные эффекты в зависимости от того, когда определяется источник света –Видовые координаты (перед LookAt) –Мировые координаты (после LookAt) –Модельные координаты Модельно-видовая матрица влияет на положение источника света Разные эффекты в зависимости от того, когда определяется источник светаРазные эффекты в зависимости от того, когда определяется источник света –Видовые координаты (перед LookAt) –Мировые координаты (после LookAt) –Модельные координаты Пример
Локализация эффекта освещения OpenGL поддерживает сфокусированные источники света GL_SPOT_DIRECTIONGL_SPOT_DIRECTION GL_SPOT_EXPONENTGL_SPOT_EXPONENT GL_SPOT_CUTOFFGL_SPOT_CUTOFF OpenGL поддерживает сфокусированные источники света GL_SPOT_DIRECTIONGL_SPOT_DIRECTION GL_SPOT_EXPONENTGL_SPOT_EXPONENT GL_SPOT_CUTOFFGL_SPOT_CUTOFF Пример
Внимание: разбиение OpenGL интерполирует цвет между вершинами. => разбиение плоскостей очень сильно влияет на качество освещения.OpenGL интерполирует цвет между вершинами. => разбиение плоскостей очень сильно влияет на качество освещения. Пример
Затухание источника света Уменьшение интенсивности света с увеличением расстояния GL_CONSTANT_ATTENUATIONGL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATIONGL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATIONGL_QUADRATIC_ATTENUATION Уменьшение интенсивности света с увеличением расстояния GL_CONSTANT_ATTENUATIONGL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATIONGL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATIONGL_QUADRATIC_ATTENUATION
Текстурирование Наложение изображения на геометрический примитив Текстуры используются для: Имитации материаловИмитации материалов Уменьшения геометрической сложностиУменьшения геометрической сложности Создания отраженийСоздания отражений Наложение изображения на геометрический примитив Текстуры используются для: Имитации материаловИмитации материалов Уменьшения геометрической сложностиУменьшения геометрической сложности Создания отраженийСоздания отражений
Наложение текстуры Три шага Определение изображенияОпределение изображения –Загрузить или создать изображение –Передать в OpenGL Назначить текстурные координаты вершинамНазначить текстурные координаты вершинам Определить параметры текстурыОпределить параметры текстуры Три шага Определение изображенияОпределение изображения –Загрузить или создать изображение –Передать в OpenGL Назначить текстурные координаты вершинамНазначить текстурные координаты вершинам Определить параметры текстурыОпределить параметры текстуры
Наложение текстуры (2) Более детальный процесс определения текстуры: Определить текстурный объект Определить способ фильтрации текстуры Задать текстурную функцию Задать способ размножения текстуры Привязать текстурный объект Включить текстурирование Определить текстурные координаты Координаты также могут генерироваться автоматически) Более детальный процесс определения текстуры: Определить текстурный объект Определить способ фильтрации текстуры Задать текстурную функцию Задать способ размножения текстуры Привязать текстурный объект Включить текстурирование Определить текстурные координаты Координаты также могут генерироваться автоматически)
Режимы наложения текстуры Режим фильтрацииРежим фильтрации –При увеличении (minification), при уменьшении (magnification) Способ размноженияСпособ размножения –Ограничение (clamp) или повторение (repeat) Текстурная функцияТекстурная функция –Способ смешения цвета текстуры с цветом примитива (замещение, перемножение) Режим фильтрацииРежим фильтрации –При увеличении (minification), при уменьшении (magnification) Способ размноженияСпособ размножения –Ограничение (clamp) или повторение (repeat) Текстурная функцияТекстурная функция –Способ смешения цвета текстуры с цветом примитива (замещение, перемножение)
Фильтрация текстур MagnificationMinification glTexParameteri(target, type, mode) type = GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MAG_FILTER
Текстурные функции Контролируют способ наложения текстуры glTexEnv{fi}(GL_TEXTURE_ENV, prop, param)glTexEnv{fi}(GL_TEXTURE_ENV, prop, param) Режимы:Режимы: –GL_MODULATE –GL_BLEND (GL_TEXTURE_ENV_COLOR задает цвет) –GL_REPLACE Контролируют способ наложения текстуры glTexEnv{fi}(GL_TEXTURE_ENV, prop, param)glTexEnv{fi}(GL_TEXTURE_ENV, prop, param) Режимы:Режимы: –GL_MODULATE –GL_BLEND (GL_TEXTURE_ENV_COLOR задает цвет) –GL_REPLACE
Способы размножения текстуры
Пример
Генерация текстурных координат Автоматическая генерация текстурных координат glTexGen{ifd}[v]() Режимы генерации координат: GL_OBJECT_LINEARGL_EYE_LINEARGL_SPHERE_MAP Координаты считаются как расстояние от заданной плоскости Ax+By+Cz+D=0 Автоматическая генерация текстурных координат glTexGen{ifd}[v]() Режимы генерации координат: GL_OBJECT_LINEARGL_EYE_LINEARGL_SPHERE_MAP Координаты считаются как расстояние от заданной плоскости Ax+By+Cz+D=0 Пример
Работа с буфером кадра
Alpha test Отбрасывание пикселей в зависимости от значения альфа-компоненты цвета glAlphaFunc( func, value);glAlphaFunc( func, value); glEnable(GL_ALPHA_TEST);glEnable(GL_ALPHA_TEST); Удобно использовать для маскирования текстур Отбрасывание пикселей в зависимости от значения альфа-компоненты цвета glAlphaFunc( func, value);glAlphaFunc( func, value); glEnable(GL_ALPHA_TEST);glEnable(GL_ALPHA_TEST); Удобно использовать для маскирования текстур
Blending Режим смешения комбинирует цвет пикселей с ранее выведенными в буфер кадра glBlendFunc( src, dst )glBlendFunc( src, dst ) Режим смешения комбинирует цвет пикселей с ранее выведенными в буфер кадра glBlendFunc( src, dst )glBlendFunc( src, dst )
Вопросы?