ПОСТРОЕНИЕ РЕАЛИСТИЧЕСКИХ ИЗОБРАЖЕНИЙ

Компьютерное графическое моделирование реальных либо виртуальных объектов предполагает воссоздание на экране компьютера не только правильные геометрические соотношения элементов сцены, но и передачу "атмосферы" визуального ряда. Сюда включаются: внешний вид материала, из которых сделан объект, признаки наличия света; преломление и смешивание цветов через полупрозрачные среды фрагментов объекта, изменяющийся по глубине туман и т.д. Для создания реалистических изображений в OpenGL существует богатый командный инструментарий, обеспечивающий:

  • • наложение текстур на поверхность объекта;
  • • задание свойств материала из которого сделан объект;
  • • определение свойств источников света;
  • • задание модели освещения;
  • • задание законов смешивания цветов через полупрозрачные поверхности;
  • • задание тумана (дымки) и т.д.

Текстуры

Текстурой называется одномерное или двумерное изображение с совокупностью параметров, определяющих, каким образом производится наложение изображения на поверхность графического объекта.

В OpenGL текстурирование выполняется по следующей схеме:

  • 1. Размещаем в оперативной памяти массив данных, в котором будет храниться образ будущей текстуры.
  • 2. Выбираем изображение (например, из файла) и преобразуем его к внутреннему формату OpenGL. Заполняем массив данными изображения.
  • 3. Создаем текстуру в памяти. Для этого будем использовать команду glTex!mage2D() для двумерных текстур, либо gluBilld2Mipmaps().
  • 4. Задаем возможные параметры фильтрации текстуры для достижения наилучшего восприятия объектов при различных коэффициентах масштабирования. Для этого будем использовать команду glTexParameter().
  • 5. Указываем, каким образом координаты текстуры связаны с координатами текстурируемого объекта. Это можно выполнить, например, командой glTexCoord().

Рассмотрим этапы текстурирования объекта подробнее.

13.1.1. Подготовка текстуры

В связи с тем, что OpenGL работает с многими операционными системами, то разработчики графической библиотеки ввели свой формат для хранения изображения. В этом формате любое изображение представлено в виде последовательности RGB составляющих точек изображения. Для облегчения считывания графических данных из файла, преобразования их во внутренний формат OpenGL и размещения в памяти существует функция AUX_RGBImageRec *auxDIBImageLoad(const char ^Filename), где Filename - название файла с расширением *.bmp или *.dib. Функция возвращает указатель на область памяти, где хранятся преобразованные данные файла. Для работы с данной функцией необходимо подключить библиотеку glaux.lib

Рассмотрим пример загрузки изображения будущей текстуры:

AUXJRGBImageRec *texture;

texture = auxDIBImageLoad("Image/tl.bmp");

В данном примере происходит загрузка файла картинки "tl.bmp" из каталога "Image". Данные файла будут сохранены в структуре texture, которую мы задали с помощью AUX_RGBImageRec.

Следует учитывать (!), что для корректной работы с текстурами необходимо соблюдать условие: размеры изображения должны быть равны степени двойки. Например: 64x64, 128x64, 256x128 и т.п. Для обеспечения этого условия можно предварительно обработать изображение в среде графического редактора, подобрав размеры "картинки" под стандарт OpenGL, либо программно изменить масштабы изображения.

Для программного изменения масштабом изображения существует команда

void gluScalelmage (GLenum format, GLint widthin, GLint heightin, GLenum typein, const void *datain, GLint widthout, GLint heightout, GLenum typeout, void *dataouf)

Рассмотрим параметры команды:

Параметр

Описание

format

Определяет формат данных пикселя и может принимать значения: GL_RED, GL_GREEN, GL_BLUE, GL_RGB, GL.ALPHA, GL_RGBA, GL_COLOR_INDEX и т.д. (см. док.). На практике обычно используют значения GLJRGB или GL_RGBA

widthin

Задает ширину оригинала изображения

heightin

Задает высоту оригинала изображения

typein

Задает тип данных для оригинала изображения, например, GL_UNSIGNED_BYTE, GLBYTE, GLBITMAP.

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 glTex!mage2D (Glenum target, Glint level, Glint interformat,

Glsizei width, Glsizei height,

Glint border, Glenum format,

Glenum type, const Glvoid *pixels)

Данная команда работает только в режиме RGB А. Рассмотрим ее параметры:

Параметр

Описание

target

Определяет тип создаваемой текстуры и должен быть равен GL_TEXTURE_2D

level

Задает число уровней детализации текстуры. Для базового уровня - 0, а если уменьшенный в п раз, то п

interformat

Задает число цветных компонентов текстуры и может принимать значения:

1 - если используется только красный (R) компонент

цвета:

  • 2 - если красный (R) и зеленый (G);
  • 4.- если красный (R), зеленый (G) и синий (В);
  • 4 - если все компоненты (RGB А)

Продолжение табл.

Параметр

Описание

width

Определяет ширину изображения текстуры и должен вычисляться по формуле 2" + 2xborder

height

Определяет высоту изображения текстуры и должен вычисляться по формуле 2'” + 2xborder)

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, и GLJLUMINANCE. Последние два значения преобразуют изображение текстуры в монохромное, так как в этом случае любая составляющая цвета переводится в яркостную

type

Задает тип данных пикселей (см. gluScalelmageO)

pixels

Определяет указатель на данные изображения для текстуры

Приведем пример вызова команды glTexImage2D(): glTexImage2D(GL_TEXTURE_2D, 0, 3, Texture->sizeX, Texture->sizeY, О, GL_RGB, GL_UNSIGNED_BYTE, Texture->data);

В данном случае создается двумерная текстура (GL_TEXTURE_2D) с нулевым уровнем детализации (0). Изображение сделано из трех компонент R, G и В (3). Ширина текстуры определяется как Texture->sizeX. Тех-ture->sizeY - высота текстуры. Ширина бордюра изображения равна нулю (0). Компоненты цвета располагаются в последовательности R, G и В (GL_RGB). Изображение состоит из байт без знака (GL_UNSIGNED_BYTE). Texture->data указывает команду, где брать данные изображения.

Как известно, для качественного текстурирования объектов необходимо соблюдать масштабные пропорции между текстурой и покрываемым объектом. Чем больше увеличение объекта, тем больше требуется образ текстуры для покрытия. И, наоборот, чем меньше становится объект тем меньше требуется размер текстуры. Вот тут и требуется уровень детализации текстуры (mipmap). Если текстура имеет размер 2"х2'”, то можно построить max(n, т) + 1 уменьшенных образов текстур. Команда glTex-Image2D() позволяет определить max(n, т) уменьшенных текстур, в каж дой из которой будет храниться уменьшенная копия оригинала. Благодаря этому OpenGL будет использовать соответствующий уровень детализации текстуры при соответствующем масштабе объекта.

В OpenGL имеется специальная команда (для одномерных текстур не рассматриваем), успешно выполняющая автоматическое построение всех возможных уровней уменьшающихся текстур по отношению к оригиналу. Это команда gluBuild2DMipmaps():

int gluBuild2DMipmaps (GLenum target, GLint components,

GLint width, GLint height,

GLenum format, GLenum type, const void *data)

Назначение параметров соответствует команде glTex!mage2D(). Кроме основной функции эта команда может работать с изображениями текстур, размер которых не является степенью 2. В этом случае происходит масштабирование образа до ближайших степеней 2. При успешном завершении работы команда возвращает значение 0, а в противном случае - код ошибки.

После выполнения команд создания текстур, последние копируются во внутреннюю память OpenGL, и поэтому память, занимаемую исходным изображением, можно освободить.

Перед тем как приступить к созданию текстур необходимо разрешить соответствующий режим командой glEnable(GL_TEXTURE_2D).

13.1.3. Эстетические параметры текстурирования объектов

При текстурировании поверхностей ЗО-моделей возникает множество проблем с качеством визуализации текстур. В основном проблемы возникают, когда на одну точку изображения на экране приходится несколько точек текстуры и наоборот. Это происходит при приближении или удалении от камеры наблюдаемого объекта. А бывают ситуации, когда в центральной проекции поверхность ЗЭ-объекта находится своими участками одновременно и в зоне увеличения, и уменьшения масштаба объекта, например, этот эффект хорошо наблюдается когда камера, расположенная рядом с поверхностью, смотрит вдоль нее. В любом случае, если не предпринимать специальных мер, наблюдается лестничный эффект для близких поверхностей и потеря рисунка текстуры для дальних участков поверхности.

Для устранения подобных проявлений в визуализации текстур в OpenGL имеются команды, настраивающие параметры визуализации текстур:

void glTexParameter [i f](

GLenum target,

GLenum pname,

GLtype param)',

void glTexParameter[i f]v(

GLenum target,

GLenum pname, Const GLtype *params);

где:

target определяет тип текстуры и принимает значения: GL_TEXTURE_2D или GL_TEXTURE_1D;

рпате определяет название параметра текстуры, которое будет изменяться;

param (params) устанавливает новое значение параметра рпате;

Рассмотрим возможные параметры текстуры (рпате):

рпате

Описание

GL_TEXTURE_MIN_FILTER

• Определяет алгоритм сжатия текстуры для объектов, размер которых был уменьшен. Существует шесть таких алгоритмов. При значении GL_NEAREST будет использоваться одна ближайшая точка в текстуре, а при значении GL_LINEAR четыре ближайших точек текстуры. Остальные четыре определяют уровни детализации для mipmapping. По умолчанию значение функции - GLJLINEAR

GL_TEXTURE_MAG_FILTER

• Определяет функцию увеличения текстуры для текстурирования объектов, размер которых был увеличен или нет. Существует два таких алгоритма. При значении GL_NEAREST будет использоваться одна ближайшая точка, а при значении GL_LINEAR четыре ближайших элемента текстуры. По умолчанию значение функции - GL_LINEAR

GL_TEXTURE_WRAP_S

• Определяет сворачивание координаты s в текстуре. При значении GL_CLAMP используются фиксированные значения: 0 или 1, что необходимо в случае, когда накладывается один образ текстуры на объект. При значении GL_ REPEAT координата s может задаваться любым значением и изображение текстуры размножается вдоль координаты s по поверхности объекта. По умолчанию значение функции - GLJREPEAT

GL_TEXTURE_WRAP_T

• Определяет координаты t в текстуре аналогично GL_TEXTURE_WRAP_S

При изменении размеров объектов по отношению к текстуре существуют следующие шесть алгоритмов "подгонки" текстуры к новым размерам объекта:

param (params)

Описание

GL.NEAREST

Выбирает ближайшую точку в текстуре

GLJLINEAR

Возвращает среднеарифметическое значение четырех ближайших точек в текстуре

GL_NEAREST_MIPMAP_NEAREST

Выбирает уровень текстурной детализации, наиболее близко соответствующий размеру пикселя. При этом выбор точек текстуры осуществляется по алгоритму GLNEAREST

GL_LINEAR_MIPMAP_NEAREST

Выбирает уровень текстурной детализации, наиболее близко соответствующий размеру пикселя. При этом выбор точек текстуры осуществляется по алгоритму GL_LINEAR

GL_ NEAREST _MIPMAP_ LINEAR

Выбирает два уровня текстурной детализации, наиболее близко соответствующих размеру пикселя. При этом выбор точек текстуры в каждом текстурном слое осуществляется по алгоритму GL_NEAREST. Итоговым значением текстуры является среднеарифметическое значение двух выбранных точек текстуры

GL_ LINEAR _MIPMAP_ LINEAR

Выбирает два уровня текстурной детализации, наиболее близко соответствующих размеру пикселя. При этом выбор точек текстуры в каждом текстурном слое осуществляется по алгоритму GL_LINEAR. Итоговым значением текстуры является среднеарифметическое значение двух выбранных точек текстуры. На практике эту фильтрацию называют - трилинейной

13.1.4. Взаимодействие текстуры с материалом объекта

Кроме задания внутренних параметров текстуры в OpenGL необходимо определить визуальное взаимодействие текстуры с видовыми атрибутами текстурируемого объекта. Для этого предусмотрены команды

void glTexEnv[i f]( void glTexEnv[i f]v(

GLenum target, GLenum target,

GLenum pname, GLenum pname,

GLtype param) GLtype *params)

Это многофункциональные команды с богатыми возможностями обработки текстур. Для полного изучения их возможностей смотрите в MSDN. В нашем случае ограничимся базовыми функциями.

Параметр target определяет цель действия функции glTexEnv* и должен быть равен GL_TEXTURE_ENV.

Параметр pname задает имя параметра GL_TEXTURE_ENV_MODE.

В качестве конкретных значений параметра будем использовать константы GL_MODULATE и GL_REPLACE.

В случае GL_MODULATE итоговое значение текстурируемого участка будет определяться умножением значений точек участка на значение соответствующих точек из текстуры.

В случае GLJREPLACE итоговое значение текстурируемого участка будет определяться только значением соответствующих точек из текстуры.

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 glTexCoordfl 2 3 4][s i f d]v (GLtype *coord)

Команда glTexCoord2* устанавливает связь координат 5 и t с ассоциируемой вершиной объекта.

Например, для ситуации, изображенной на рисунке, фрагмент кода программы имеет вид

glBegin(GL_TRIANGLES); // Рисуем треугольник

glTexCoord2f(0.0f, 1 .Of);glVertex3f(2.Of,8.Of,O.Of);

glTexCoord2f(l .Of, 1 .Of);glVertex3f(6.Of,8.Of,O.Of);

glTexCoord2f(0.0f,0.0f);glVertex3f(2.0f, 1 .Of,O.Of);

glEnd();

Если требуется "размножение" текстуры на поверхности объекта, то это можно реализовать изменением кратности параметра s или t в команде glTexCoord2*. Например, нам необходимо уложить на текстурируемую поверхность 10 "картинок" текстуры по ширине. Для этого достаточно записать следующий код программы

glBegin(GL_QUADS); // Рисуем прямоугольник

glTexCoord2f( 0.0f,0.0f);glVertex3f( 1 .Of, 1,0f,l.Of);

glTexCoord2f( 0.0f,1.0f);glVertex3f( 1.Of,5.Of, 1.Of);

glTexCoord2f(10.0f, 1 .Of);glVertex3f(l 1 .Of,5.Of, 1 .Of);

glTexCoord2f( 10.0f,0.0f);glVertex3f( 11 .Of, 1 .Of, 1 .Of);

glEnd();

Другой способ задания сопоставления координат текстуры с координатами вершин объекта основан на задании некоторой функции, которая в текущий момент времени рассчитывает координаты текстуры для каждой вершины объекта. И реализовано это командами

void glTexGen[i f d]( void glTexGenfi f d]v(

GLenum coord, GLenum coord,

GLenum pname, GLenum pname,

GLtype param) 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_LINEAR

• Соответствующие координаты 5, t, г или q вычисляются по формуле

g = РЧ + р2х0 + P3z0 + P4wo,

где Р],...,р4 - значения, находящиеся в params', х0, ...,w0 - мировые координаты вершины (см. MSDN)

GL_EYE_LINEAR

• Соответствующие координаты s, t, г или q вычисляются по формуле

g = Р1'Хе + Р2е + P3'Ze + P4'We ,

где (Рг,р2',р3’,р4') = (рх234)М~{ ?, М - матрица видового преобразования; хе, ...,we - видовые координаты вершины. Координаты текстуры объекта в этом случае зависят от положения объекта (см. MSDN)

GL_SPHERE_MAP

• Дана функция позволяет моделировать эффект зеркального отражения от поверхности объекта. Для ее исполнения требуются видовые координаты и задание нормалей (см. MSDN)

Включение автоматического режима задания текстурных координат осуществляется командой glEnable с параметром GL_TEXTURE_GEN_S или GL_TEXTURE_GEN_P

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ   След >