Главная страница

3 С. А. Васильев opengl компьютерная графика


Скачать 491.09 Kb.
Название3 С. А. Васильев opengl компьютерная графика
Дата23.03.2018
Размер491.09 Kb.
Формат файлаpdf
Имя файлаvasilev.pdf
ТипУчебное пособие
#39231
страница6 из 9
1   2   3   4   5   6   7   8   9
13.1.1 Подготовка текстуры
В связи с тем, что OpenGL работает с многими операционными системами, то разработчики графи- ческой библиотеки ввели свой формат для хранения изображения. В этом формате любое изображение представлено в виде последовательности RGB составляющих точек изображения. Для облегчения счи- тывания графических данных из файла, преобразования их во внутренний формат OpenGL и размеще- ния в памяти существует функция AUX_RGBImageRec *auxDIBImageLoad(const char *Filename), где
Filename – название файла с расширением *.bmp или *.dib. Функция возвращает указатель на область памяти, где хранятся преобразованные данные файла. Для работы с данной функцией необходимо под- ключить библиотеку glaux.lib
Рассмотрим пример загрузки изображения будущей текстуры:

AUX_RGBImageRec *texture; texture = auxDIBImageLoad("Image/t1.bmp");

В данном примере происходит загрузка файла картинки "t1.bmp" из каталога "Image". Данные фай- ла будут сохранены в структуре texture, которую мы задали с помощью AUX_RGBImageRec.
Следует учитывать (!), что для корректной работы с текстурами необходимо соблюдать условие:

37
размеры изображения должны быть равны степени двойки. Например: 64×64, 128×64, 256×128 и т.п.
Для обеспечения этого условия можно предварительно обработать изображение в среде графического редактора, подобрав размеры "картинки" под стандарт OpenGL, либо программно изменить масштабы изображения.
Для программного изменения масштабом изображения существует команда void gluScaleImage (GLenum format, GLint widthin, GLint heightin,
GLenum typein, const void *datain,
GLint widthout, GLint heightout,
GLenum typeout, void *dataout)
Рассмотрим параметры команды:
Пара- метр
Описание
format
Определяет формат данных пикселя и может принимать значения: GL_RED, GL_GREEN,
GL_BLUE, GL_RGB, GL_ALPHA, GL_RGBA,
GL_COLOR_INDEX и т.д. (см. док.). На практи- ке обычно используют значения GL_RGB или
GL_RGBA
widthin
Задает ширину оригинала изображения
heightin
Задает высоту оригинала изображения
typein
Задает тип данных для оригинала изображения, напри- мер, GL_UNSIGNED_BYTE, GL_BYTE,
GL_BITMAP, GL_UNSIGNED_SHORT,
GL_INT, GL_UNSIGNED_INT, GL_SHORT,
или GL_FLOAT
Продолжение табл.
Пара- метр
Описание
datain
Указатель на данные оригинала изображения
widthout Задает ширину измененного масштабом изобра- жения
heightout Задает высоту измененного масштабом изобра- жения
typeout
Задает тип данных для измененного масштабом изображения (см. typein)
dataout
Указатель на данные измененного масштабом изображения
В результате своей работы функцияgluScaleImage() берет из памяти по адресу datain изображение "картинки", изменяет его, согласно своих параметров, и заносит в область памяти, на которую указыва- ет параметр dataout. В случае удачного преобразования функция возвращает значение ноль, либо код ошибки.
13.1.2 Создание текстуры
После того как изображение для двумерной текстуры подготовлено и находится в памяти, можно создать саму текстуру. Это осуществляется командой: void glTexImage2D (Glenum target, Glint level,Glint interformat,
Glsizei width,Glsizei height,
Glint border,Glenum format,
Glenum type,const Glvoid *pixels)

38
Данная команда работает только в режиме RGBA. Рассмотрим ее параметры:
Параметр
Описание
target
Определяет тип создаваемой текстуры и дол- жен быть равен GL_TEXTURE_2D.
level
Задает число уровней детализации текстуры.
Для базового уровня – 0, а если уменьшенный в n раз, то n.
interformat
Задает число цветных компонентов текстуры и может принимать значения:
1 – если используется только красный (R) компонент цвета:
2 – если красный (R) и зеленый (G);
4
– если красный (R), зеленый (G) и синий (B);
4 – если все компоненты (RGBA).
Продолжение табл.
Параметр
Описание
width
Определяет ширину изображения текстуры и должен вычисляться по формуле 2
n
+ 2×border
height
Определяет высоту изображения текстуры и должен вычисляться по формуле 2
m
+
border)
border
Задает ширину границы изображения тексту- ры. Принимаемые значения: 0 или 1.
format
Определяет формат данных пикселя и может принимать одно из значения: GL_RED,
GL_GREEN, GL_BLUE, GL_ALPHA,
GL_RGB, GL_RGBA, GL_BGR_EXT,
GL_COLOR_INDEX,
GL_LUMINANCE_ALPHA,
GL_BGRA_EXT, и GL_LUMINANCE. По- следние два значения преобразуют изображе- ние текстуры в монохромное, так как в этом случае любая составляющая цвета переводится в яркостную.
type
Задает тип данных пикселей (см. gluS- caleImage())
pixels
Определяет указатель на данные изображения для текстуры
Приведем пример вызова команды glTexImage2D(): glTexImage2D(GL_TEXTURE_2D, 0, 3,
Texture->sizeX, Texture->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE,
Texture->data);
В данном случае создается двумерная текстура (GL_TEXTURE_2D). С нулевым уровнем детализа- ции (0). Изображение сделано из трех компонент R, G и В (3). Ширина текстуры определяется как Tex- ture->sizeX. Texture->sizeY – высота текстуры. Ширина бордюра изображения рав- на нулю (0). Компоненты цвета располагаются в последовательности
R, G и B (GL_RGB). Изображение состоит из байт без знака (GL_UNSIGNED_BYTE).Texture->data указывает команду, где брать данные изображения.

39
Как известно, для качественного текстурирования объектов необходимо соблюдать масштабные пропорции между текстурой и покрываемым объектом. Чем больше увеличение объекта, тем больше требуется образ текстуры для покрытия. И, наоборот, чем меньше становится объект тем меньше требу- ется размер текстуры. Вот тут и требуется уровень детали- зации текстуры (mipmap). Если текстура имеет размер 2
n
×2
m
, то можно построить max(n, m) + 1 уменьшенных образов текстур. Команда glTexImage2D()позволяетопределить max(n, m) уменьшенных текстур, в каждой из которой будет храниться уменьшенная копия оригинала.
Благодаря этому OpenGL будет использовать соответствующий уровень детализации текстуры при со- ответствующем масштабе объекта.
В OpenGL имеется специальная команда (для одномерных текстур не рассматриваем) успешно вы- полняющая автоматическое построение всех возможных уровней уменьшающихся текстур по отноше- нию к оригиналу. Это команда gluBuild2DMipmaps():
int gluBuild2DMipmaps (GLenum target,GLint components,
GLint width,GLint height,
GLenum format,GLenum type,
const void *data)
Назначение параметров соответствует команде glTexImage2D(). Кроме основной функции эта ко- манда может работать с изображениями текстур размер которых не является степенью 2. В этом случае происходит масштабирование образа до ближайших степеней 2. При успешном завершении работы ко- манда возвращает значение 0, а в противном случае – код ошибки.
После выполнения команд создания текстур, последние копируются во внутреннюю память
OpenGL, и поэтому память, занимаемую исходным изображением, можно освободить.
Перед тем как приступить к созданию текстур необходимо разрешить соответствующий режим ко- мандой glEnable(GL_TEXTURE_2D).
13.1.3 Эстетические параметры текстурирования объектов
При тестурировании поверхностей 3D моделей возникают множество проблем с качеством визуали- зации текстур. В основном проблемы возникают когда на одну точку изображения на экране приходит- ся несколько точек текстуры и наоборот. Это происходит при приближении или удалении от камеры наблюдаемого объекта. А бывают ситуации, когда в центральной проекции поверхность 3D объекта на- ходится своими участками одновременно и в зоне увеличения и уменьшения масштаба объекта, напри- мер, этот эффект хорошо наблюдается когда камера, расположенная рядом с поверхностью, смотрит вдоль ее. В любом случае, если не предпринимать специальных мер, наблюдается лестничный эффект для близких поверхностей и потеря рисунка текстуры для дальних участков поверхности.
Для устранения подобных проявлений в визуализации текстур в OpenGL имеются команды настраи- вающие параметры визуализации текстур: void glTexParameter [i f](
GLenum target,
GLenum pname,
GLtype
param
); void glTexParameter[i
f]v(
GLenum target,
GLenum pname,
Const GLtype *
param
s);
ГДЕ:
TARGET ОПРЕДЕЛЯЕТ ТИП ТЕКСТУРЫ И ПРИНИМАЕТ ЗНАЧЕНИЯ: GL_TEXTURE_2D
ИЛИ GL_TEXTURE_1D;
PNAME ОПРЕДЕЛЯЕТ НАЗВАНИЕ ПАРАМЕТРА ТЕКСТУРЫ, КОТОРОЕ БУДЕТ ИЗМЕ-
НЯТЬСЯ;
PARAM
(
PARAM
S) УСТАНАВЛИВАЕТ НОВОЕ ЗНАЧЕНИЕ ПАРАМЕТРА PNAME;
РАССМОТРИМ ВОЗМОЖНЫЕ ПАРАМЕТРЫ ТЕКСТУРЫ (PNAME):
pname
Описание
GL_TEXTURE_MIN_FIL
TER
ОПРЕДЕЛЯЕТ АЛГОРИТМ
СЖАТИЯ ТЕКСТУРЫ ДЛЯ
ОБЪЕКТОВ, РАЗМЕР КО-
ТОРЫХ

40
pname
Описание
БЫЛ УМЕНЬШЕН. СУЩЕ-
СТВУЕТ ШЕСТЬ ТАКИХ
АЛГОРИТМОВ. ПРИ ЗНА-
ЧЕНИИ GL_NEAREST БУ-
ДЕТ
ИСПОЛЬЗОВАТЬСЯ
ОДНА БЛИЖАЙШАЯ ТОЧ-
КА В ТЕКСТУРЕ, А ПРИ
ЗНАЧЕНИИ GL_LINEAR ЧЕ-
ТЫРЕ БЛИЖАЙШИХ ТО-
ЧЕК ТЕКСТУРЫ. ОСТАЛЬ-
НЫЕ ЧЕТЫРЕ ОПРЕДЕЛЯ-
ЮТ УРОВНИ ДЕТАЛИЗА-
ЦИИ ДЛЯ MIPMAPPING. ПО
УМОЛЧАНИЮ ЗНАЧЕНИЕ
ФУНКЦИИ – GL_LINEAR.
GL_TEXTURE_MAG_FI
LTER
• Определяет функцию увеличе- ния текстуры для текстурирова- ния объектов, размер которых был увеличен или нет. Сущест- вует два таких алгоритма. При значении GL_NEAREST будет использоваться одна ближайшая точка, а при значении
GL_LINEAR четыре ближай- ших элемента текстуры. По умолчаниюзначение функции –
GL_LINEAR.
GL_TEXTURE_WRAP_S
• Определяет сворачивание ко- ординаты s в текстуре. При зна- чении GL_CLAMP использу- ются фиксированные значения:
0 или 1, что необходимо в слу- чае когда накладывается один образ текстуры на объект. При значении GL_ REPEAT коор- дината s может задаваться лю- бым значением и изображение текстуры размножается вдоль координаты s по поверхности объекта. По умолчаниюзначе- ние функции – GL_REPEAT.
GL_TEXTURE_WRAP_
T
• Определяет координаты t в текстуре аналогично
GL_TEXTURE_WRAP_S.
ПРИ ИЗМЕНЕНИИ РАЗМЕРОВ ОБЪЕКТОВ ПО ОТНОШЕНИЮ К ТЕКСТУРЕ СУЩЕСТ-
ВУЮТ СЛЕДУЮЩИЕ ШЕСТЬ АЛГОРИТМОВ "ПОДГОНКИ" ТЕКСТУРЫ К НОВЫМ РАЗ-
МЕРАМ ОБЪЕКТА:
param
(
param
s)
Описание
GL_NEAREST
ВЫБИРАЕТ БЛИЖАЙ-
ШУЮ ТОЧКУ В ТЕКСТУ-
РЕ

41
param
(
param
s)
Описание
GL_LINEAR
Возвращает среднеарифме- тическое зна-чение четырех ближайших точек в текстуре
GL_NEAREST_MIPMAP_
NEAREST
Выбирает уровень текстур- ной детализации наиболее близко соответствующий размеру пикселя. При этом выбор точек текстуры осу- ществляется по алгоритму
GL_NEAREST
GL_LINEAR_MIPMAP_NE
AREST
Выбирает уровень текстур- ной детализации наиболее близко соответствующий размеру пикселя. При этом выбор точек текстуры осу- ществляется по алгоритму
GL_LINEAR
GL_ NEAREST _MIPMAP_
LINEAR
Выбирает два уровня тек- стурной детализации наибо- лее близко соответствующих размеру пикселя. При этом выбор точек текстуры в каж- дом текстурном слое осуще- ствляется по алгоритму
GL_NEAREST. Итоговым значением текстуры является среднеарифметическое зна- чение двух выбранных точек текстуры
GL_ LINEAR _MIPMAP_
LINEAR
Выбирает два уровня тек- стурной детализации наибо- лее близко соответствующих размеру пикселя. При этом выбор точек текстуры в каж- дом текстурном слое осуще- ствляется по алгоритму
GL_LINEAR. Итоговым значением текстуры является среднеарифметическое зна- чение двух выбранных точек текстуры. На практике эту фильтрацию называют – тpилинейной
13.1.4 Взаимодействие текстуры с материалом объекта
Кроме задания внутренних параметров текстуры в OpenGL необходимо определить визуальное взаимодействие текстуры с видовыми атрибутами текстурируемого объекта. Для этого предусмотрена команды

42
void glTexEnv[i f](
GLenum target,
GLenum pname,
GLtype param) void glTexEnv[i f]v(
GLenum target,
GLenum pname,
GLtype *params)
Это многофункциональные команды с богатыми возможностями обработки текстур. Для полного изучения их возможностей смотрите в MSDN. В нашем случае ограничимся базовыми функциями.
Параметр target определяет цель действия функции glTexEnv* и должен быть равен
GL_TEXTURE_ENV.
Параметр pname задает имя параметра и будем использовать GL_TEXTURE_ENV_MODE.
В качестве конкретных значений параметра будем использовать константы GL_MODULATE и
GL_REPLACE.
В случае GL_MODULATE итоговое значение текстурируемого участка будет определяться умно- жением значений точек участка на значение соответствующих точек из текстуры.
В случае GL_REPLACE итоговое значение текстурируемого участка будет определяться только значением соответствующих точек из текстуры.
13.1.5 Координаты текстуры
В OpenGL координаты точек на текстуре представлены в параметрической системе координат (s, t).
Значения s и t находятся в отрезке [0,1].
Для текстурирования объекта необходимо указать связь вершин объекта и соответствующих то- чек в текстуре (см. рис. 6). Для этой цели
Рис. 6 Текстурирование объекта
имеются несколько команд. Одна из них в явном виде задает координаты текстуры для каждой верши- ны объекта и имеет вид: void glTexCoord[1 2 3 4][s i f d] (GLtype coord) void glTexCoord[1 2 3 4][s i f d]v (GLtype *coord)
Команда glTexCoord2* устанавливает связь координат s и t c ассоциируемой вершиной объекта.
Например, для ситуации изображенной на рисунке фрагмент кода программы имеет вид glBegin(GL_TRIANGLES); // Рисуем треугольник glTexCoord2f(0.0f,1.0f);glVertex3f(2.0f,8.0f,0.0f); glTexCoord2f(1.0f,1.0f);glVertex3f(6.0f,8.0f,0.0f); glTexCoord2f(0.0f,0.0f);glVertex3f(2.0f,1.0f,0.0f); glEnd();
Если требуется "размножение" текстуры на поверхности объекта, то это можно реализовать изме- нением кратности параметра s или t в команде glTexCoord2*. Например, нам необходимо уложить на текстурируемую поверхность 10 "картинок" текстуры по ширине. Для этого достаточно записать сле- дующий код программы glBegin(GL_QUADS); // Рисуем прямоугольник glTexCoord2f( 0.0f,0.0f);glVertex3f( 1.0f,1.0f,1.0f); glTexCoord2f( 0.0f,1.0f);glVertex3f( 1.0f,5.0f,1.0f); glTexCoord2f(10.0f,1.0f);glVertex3f(11.0f,5.0f,1.0f); glTexCoord2f(10.0f,0.0f);glVertex3f(11.0f,1.0f,1.0f);
s
t
(0,0)
(0,1)
(1,1)
(1,0)
y
x
z
Текстура
Объект
Текстура на объекте
(2, 1, 0)
(6, 8, 0)
(2, 8, 0)

43
glEnd();
Другой способ задания сопоставления координат текстуры с координатами вершин объекта основан на задании некоторой функции, которая в текущий момент времени рассчитывает координаты текстуры для каждой вершины объекта. И реализовано это командами void glTexGen[i f d](
GLenum coord,
GLenum pname,
GLtype param) void glTexGen[i f d]v(
GLenum coord,
GLenum pname, const GLtype *params)
Параметр coord определяет координату текстуры, к которым будет применяться функция преобра- зования, и может принимать одно из значений GL_S, GL_T, GL_R или GL_Q.
Имя параметра pname должно принимать значение GL_TEXTURE_GEN_MODE (для первой ко- манды).
В качестве параметра param можно использовать следующие значения: GL_OBJECT_LINEAR,
GL_EYE_LINEAR или GL_SPHERE_MAP.
Параметр
Описание
GL_OBJECT_LINE
AR
СООТВЕТСТВУЮЩИЕ
КО-
ОРДИНАТЫ S, T, R ИЛИ Q ВЫ-
ЧИСЛЯЮТСЯ ПО ФОРМУЛЕ
0 4
0 3
0 2
0 1
w
p
z
p
x
p
x
p
g
+
+
+
=
,
ГДЕ
4 1
,..., p
p
– ЗНАЧЕНИЯ, НА-
ХОДЯЩИЕСЯ В
PARAM
S;
0 0
,..., w
x
– МИРОВЫЕ КООРДИНАТЫ
ВЕРШИНЫ (СМ. MSDN)
GL_EYE_LINEAR
• Соответствующие координаты s, t,
r или q вычисляются по формуле
e
e
e
e
w
p
z
p
x
p
x
p
g
4 3
2 1




+
+
+
=
, где
1 4
3 2
1 4
3 2
1
)
,
,
,
(
)
,
,
,
(





=
M
p
p
p
p
p
p
p
p
;
M – матрица видового преобразова- ния;
e
e
w
x ,...,
– видовые координаты вершины. Координаты текстуры объ- екта в этом случае зависят от поло- жения объекта (см. MSDN)
1   2   3   4   5   6   7   8   9


написать администратору сайта