
- •Содержание
- •Введение
- •1 Лабораторная работа №1 opengl и графические примитивы
- •1.1 Теоретические положения
- •1.1.1 Структура OpenGl-проекта
- •1.1.2 Работа с графическими примитивами
- •1.1.2.1 Точки
- •1.1.2.2 Линии
- •1.1.2.3 Треугольники
- •1.1.2.4 Четырехугольники и многоугольники
- •1.1.2.5 Массивы вершин и цветов
- •1.1.2.6 Область вывода
- •1.2 Практика
- •1.2.1 Общее задание
- •1.2.2 Варианты индивидуального задания
- •2 Лабораторная работа №2 Матрицы и геометрические преобразования
- •2.1 Теоретические положения
- •2.1.1 Системы координат OpenGl
- •2.1.2 Видовые преобразования
- •2.1.3 Ориентация
- •2.1.4 Трехмерные примитивы
- •2.2 Практика
- •2.2.1 Общее задание
- •2.2.2 Варианты индивидуального задания
- •3 Лабораторная работа №3 Проекции, источники света, материалы
- •3.1 Теоретические положения
- •3.1.1 Виды плоских проекций
- •3.1.1.1 Ортографическая проекция
- •3.1.1.2 Одноточечная перспективная проекция
- •3.1.2 Освещение объектов
- •3.1.2.1 Нормали и грани
- •3.1.2.2 Материалы
- •3.1.2.3 Источники света
- •3.1.2.3 Модели освещения и затенения
- •3.2 Практика
- •3.2.1 Общее задание
- •3.2.2 Варианты индивидуального задания
- •4 Лабораторная работа №4 Отсечение и прозрачность
- •4.1 Теоретические положения
- •4.1.1 Принадлежность пикселей контексту воспроизведения
- •4.1.2 Отсечение
- •4.1.3 Прозрачность
- •4.2 Практика
- •4.2.1 Общее задание
- •5 Лабораторная работа №5 Трафареты и глубина
- •5.1 Теоретические положения
- •5.1.1 Трафарет
- •5.1.2 Глубина
- •5.2 Практика
- •5.2.1 Общее задание
- •6 Лабораторная работа №6 Текстуры
- •6.1 Теоретические положения
- •6.1.2 Загрузка графического файла в память
- •6.1.3 Создание имени-идентификатора текстуры
- •6.1.4 Установка идентификатора в активное положение
- •6.1.5 Создание текстуры в памяти
- •6.1.6 Установка параметров текстуры
- •6.1.7 Установка параметров взаимодействия текстуры с объектом
- •6.1.8 Связывание координат текстуры с объектом
- •6.2 Практика
- •6.2.1 Общее задание
- •7 Список литературы
- •Приложение а
- •Приложение б шаблон opengl-проекта «basis»
- •Приложение в Синтаксис команд и типы данных OpenGl
- •Приложение г Пример двумерного рисунка
- •Приложение д Положение источников света
6.1.2 Загрузка графического файла в память
Графический формат OpenGL представляет собой последовательность троек, определяющих красный, зеленый и синий компоненты цвета. Преобразовать изображение из другого формата можно вручную, а можно воспользоваться функцией auxDIBImageLoad(LPCSTR), которая загружает в память bmp-файл и возвращает указатель на структуру:
typedef struct _AUX_RGBImageRec {
GLint sizeX, sizeY;
unsigned char *data;
} AUX_RGBImageRec;
Для этого объявляется глобальная переменная (строки 3, 4 в примере) и загружается bmp-файл (строки 10, 11).
Для того чтобы можно было работать с текстурой, необходимо разрешить соответствующий режим – выполнить команду glEnable с аргументамиGL_TEXTURE_1DилиGL_TEXTURE_2D,в зависимости от того, с одномерным или двумерным изображением будем работать (строки 47, 66)
Текстуры в OpenGL должны иметь размер 2n x 2m, где n и m целые числа. Сжимать или растягивать такие текстуры быстрее и удобней. Можно загрузить изображение любого другого размера, но его придется масштабировать.
6.1.3 Создание имени-идентификатора текстуры
Имена-идентификаторы текстуры нужно создавать, когда в приложении вы используете более одной текстуры, чтобы была возможность как-то их различать. В противном случае, когда текстура только одна, идентификатор ей не нужен.
Для имени-идентификатора объявляется глобальная переменная, она будет служить идентификатором текстур (строки 5, 6).
Функция glGenTextures создает имена текстур, принимает на вход два параметра. Первый указывает количество имен-идентификаторов текстур, которые нужно создать. Второй параметруказатель на массив элементов типаunsigned int.
В примере строки 12, 13.
6.1.4 Установка идентификатора в активное положение
Для этого служит функция glBindTexture. Первый параметр должен бытьGL_TEXTURE_2DилиGL_TEXTURE_1D. Второй параметрglBindTexture– идентификатор, который был создан выше при помощиglGenTextures (строки 14, 19).
6.1.5 Создание текстуры в памяти
Массив байт в структуре AUX_RGBImageRecне является еще текстурой, потому что у текстуры много различных параметров. Среди параметров текстуры надо указывать уровень детализации, способ масштабирования и связывания текстуры с объектом. Уровень детализации нужен для наложения текстурына меньшие объекты, т.е. когда площадь на экране меньше размеров изображения. Нулевой уровень детализации соответствует исходному изображению размером 2nx2m, первый уровень –(2n-1)x(2m-1), k-ый уровень – (2n-k)x(2m-k). Число уровней соответствует min(n,m). Для создания текстуры имеются две функции:
glTexImage[1/2]D и gluBuild[1/2]DMipmaps.
Основное различие в том, что первая функция создает текстуру одного определенного уровня детализации и воспринимает только изображения, размер которых кратен степени двойки. Вторая функция более гибкая. Она генерирует текстуры всех уровней детализации. Также эта функция не требует, чтобы размер изображения был кратен степени двойки. Она сама сожмет/растянет изображение подходящим образом, хотя, возможно, окажется, что и не вполне подходящим.
glTexImage2D (
GLenum target,
GLint lavel,
GLint components,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid* pixels)
где target – тип создаваемой текстурыGL_TEXTURE_1DилиGL_TEXTURE_2D;
level– определяет число уровней детализации текстуры: 0 – базовый уровень, а k – уменьшенный в k раз образ;
components – задает число цветовых компонентов текстуры и может принимать значения 1, 2, 3 или 4. При значении 1 используется только красный компонент, при 2 – красный и альфа, при 3 – красный, зеленый и синий и при 4все четыре компонента цвета;
width– определяет ширину образа текстуры и должен составлять 2n+2*border;
height– определяет высоту образа и должен составлять 2m+2*border, для командыglTexImage2Dи всегда равен 1 для командыglTexImage1D;
border– определяет ширину границы и должен иметь значение 0 или 1;
format – определяет формат данных пикселя и может принимать различные значения, для нашей работы потребуется значениеGL_RGB. Оно означает, что каждый элемент представляет собой три компонента – красный, зеленый и синий, каждый из которых преобразуется к вещественному формату, после чего собирается RGBA-элемент, у которого компонент альфа равен 1.0. Так же можно использоватьGL_RGBA(аналогичноGL_RGB, только для всех четырех компонентов цвета);
type – определяет тип данных пикселя.
pixels– определяет указатель на образ данных в памяти. Каждый байт данных рассматривается, как восемь одноразрядных элементов, порядок расположения которых задается аргументомGL_UNPACK_LSB_FIRSTкомандыglPixelStore. Вызов функцииglPixelStoreнеобходим для того, чтобы указать, что выравнивание в массиве данных идет по байту.
Строки в примере 15, 16, 22, 22.
gluBuild2DMipmaps(
GLenum target,
GLint components,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
const GLvoid* pixels)
Аналогичный результат можно получить, вставив вызов gluBuild2DMipmapsс параметрами, указанными ниже.
gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
photo_image->sizeX,
photo_image->sizeY,
GL_RGB, GL_UNSIGNED_BYTE,
photo_image->data);
Образ создается в пространстве текстуры с координатной системой (s,t). Причем s=0, t=0 – левый нижний угол текстуры; s=1, t=1 – правый верхний угол.