Файл: графическая библиотека opengl.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.06.2020

Просмотров: 1709

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 46

параметры

описывающее

 

положение

 

в

 

пространстве

преобразуются

 

текущей

 

модельно

-

видовой

 

матрицей

 

в

 

момент

 

формирования

 

объекта

т

.

е

в

 

момент

 

вызова

 

соответствующих

 

команд

 OpenGL. 

Таким

 

образом

формируя

 

источник

 

света

 

одновременно

 

с

 

объектом

 

сцены

 

или

 

камерой

его

 

можно

 

привязать

 

к

 

этому

 

объекту

Или

наоборот

сформировать

 

стационарный

 

источник

 

света

который

 

будет

 

оставаться

 

на

 

месте

пока

 

другие

 

объекты

 

перемещаются

Общее

 

правило

 

такое

Если

 

положение

 

источника

 

света

 

задается

 

командой

 

glLight*()

 

перед

 

определением

 

положения

 

виртуальной

 

камеры

  (

например

командой

 

glLookAt()

), 

то

 

будет

 

считаться

что

 

координаты

 (0,0,0) 

источника

 

находится

 

в

 

точке

 

наблюдения

 

и

следовательно

положение

 

источника

 

света

 

определяется

 

относительно

 

положения

 

наблюдателя

Если

 

положение

 

устанавливается

 

между

 

определением

 

положения

 

камеры

 

и

 

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

 

модельно

-

видовой

 

матрицы

 

объекта

то

 

оно

 

фиксируется

т

.

е

в

 

этом

 

случае

 

положение

 

источника

 

света

 

задается

 

в

 

мировых

 

координатах

.  

Для

 

использования

 

освещения

 

сначала

 

надо

 

установить

 

соответствующий

 

режим

 

вызовом

 

команды

 

glEnable(GL_LIGHTNING)

а

 

затем

 

включить

 

нужный

 

источник

 

командой

  

glEnable(GL_LIGHTi)

.  

Еще

 

раз

 

обратим

 

внимание

 

на

 

то

что

 

при

 

выключенном

 

освещении

 

цвет

 

вершины

 

равен

 

текущему

 

цвету

который

 

задается

 

командами

 

glColor*()

При

 

включенном

 

освещении

 

цвет

 

вершины

 

вычисляется

 

исходя

 

из

  

информации

 

о

 

материале

нормалях

 

и

  

источниках

 

света

При

 

выключении

 

освещения

 

визуализация

 

происходит

 

быстрее

однако

 

в

 

таком

 

случае

 

приложение

 

должно

 

само

 

рассчитывать

 

цвета

 

вершин

Текст

 

программы

демонстрирующей

 

основные

 

принципы

 

определения

 

материалов

 

и

 

источников

 

света

приведен

 

в

 

приложении

 

D.2 

 

4.4. 

Создание

 

эффекта

 

тумана

 

В

 

завершение

 

рассмотрим

 

одну

 

интересную

 

и

 

часто

 

используемую

 

возможность

 OpenGL – 

создание

 

эффекта

 

тумана

Легкое

 

затуманивание

 

сцены

 

создает

 

реалистичный

 

эффект

а

 

частенько

 

может

 


background image

 47

и

 

скрыть

 

некоторые

 

артефакты

которые

 

появляются

когда

 

в

 

сцене

 

присутствуют

 

отдаленные

 

объекты

Туман

 

в

 OpenGL 

реализуется

 

путем

 

изменения

 

цвета

 

объектов

 

в

 

сцене

 

в

 

зависимости

 

от

 

их

 

глубины

т

.

е

расстояния

 

до

 

точки

 

наблюдения

Изменение

 

цвета

 

происходит

 

либо

 

для

 

вершин

 

примитивов

либо

 

для

 

каждого

 

пикселя

 

на

 

этапе

 

растеризации

 

в

 

зависимости

 

от

 

реализации

 OpenGL. 

Этим

 

процессом

 

можно

 

частично

 

управлять

 – 

см

раздел

 6.4. 

Для

 

включения

 

эффекта

 

затуманивания

 

необходимо

 

вызвать

 

команду

 

glEnable(GL_FOG)

.  

Метод

 

вычисления

 

интенсивности

 

тумана

 

в

 

вершине

 

можно

 

определить

 

с

 

помощью

 

команд

 

void

 

glFog[if]

 (

enum

 

pname

T

 

param

;

  

void

 

glFog[if]v

 (

enum

 

pname

T

 

params

;

  

 

Аргумент

 

pname

 

может

 

принимать

 

следующие

 

значения

GL_FOG_MODE                   

аргумент

 

param

 

определяет

 

формулу

по

 

которой

 

будет

 

вычисляться

 

интенсивность

 

тумана

 

в

 

точке

.  

В

 

этом

 

случае

 

param

 

может

 

принимать

 

значения

  

GL_EXP

  

Интенсивность

 

вычисляется

 

по

 

формуле

 f=exp(-d*z) 

GL_EXP2

  

Интенсивность

 

вычисляется

 

по

 

формуле

 f=exp(-(d*z)

2

GL_LINEAR

  

Интенсивность

 

вычисляется

 

по

 

формуле

 f=e-z/e-s 

где

 z – 

расстояние

 

от

 

вершины

в

 

которой

 

вычисляется

 

интенсивность

 

тумана

до

 

точки

 

наблюдения

Коэффициенты

 d,e,s 

задаются

 

с

 

помощью

 

следующих

 

значений

 

аргумента

 

pname

 

GL_FOG_DENSITY  

param

 

определяет

 

коээфициент

 d  

GL_FOG_START 

param

 

определяет

 

коэффициент

 s  

GL_FOG_END 

param 

определяет

 

коэффициент

 e  

Цвет

 

тумана

 

задается

 

с

 

помощью

 

аргумента

 

pname

равного

 

GL_FOG_COLOR  

 

в

 

этом

 

случае

 

params

 – 

указатель

 

на

 

массив

 

из

 4-

х

 

компонент

 

цвета


background image

 48

Приведем

 

пример

 

использования

 

этого

 

эффекта

GLfloat FogColor[4]={0.5,0.5,0.5,1}; 
glEnable(GL_FOG); 
glFogi(GL_FOG_MODE,GL_LINEAR); 
glFogf(GL_FOG_START,20.0); 
glFogf(GL_FOG_END,100.0); 
glFogfv(GL_FOG_COLOR,FogColor); 
 

Контрольные

 

вопросы

 

1. 

Поясните

 

разницу

 

между

 

локальными

 

и

 

бесконечно

 

удаленными

 

источниками

 

света

2. 

Для

 

чего

 

служит

 

команда

 glColorMaterial? 

3. 

Как

 

задать

 

положение

 

источника

 

света

 

таким

 

образом

чтобы

 

он

 

всегда

 

находился

 

в

 

точке

 

положения

 

наблюдателя

4. 

Как

 

задать

 

фиксированное

 

положение

 

источника

 

света

Можно

 

ли

 

задавать

 

положение

 

источника

 

относительно

 

локальных

 

координат

 

объекта

5. 

Как

 

задать

 

конусный

 

источник

 

света

6. 

Если

 

в

 

сцене

 

включено

 

освещение

но

 

нет

 

источников

 

света

какой

 

цвет

 

будут

 

иметь

 

объекты

 

 


background image

 49

Глава

 5  

 

Текстурирование

 

Под

 

текстурой

 

будем

 

понимать

 

некоторое

 

изображение

которое

 

надо

 

определенным

 

образом

 

нанести

 

на

 

объект

например

для

 

придания

 

иллюзии

 

рельефности

 

поверхности

Наложение

 

текстуры

 

на

 

поверхность

 

объектов

 

сцены

 

повышает

 

ее

 

реалистичность

однако

 

при

 

этом

 

надо

 

учитывать

что

 

этот

 

процесс

 

требует

 

вычислительных

 

затрат

особенно

 

если

    OpenGL 

не

 

поддерживается

 

аппаратно

.  

Для

 

работы

 

с

 

текстурой

 

следует

 

выполнить

 

следующую

 

последовательность

 

действий

:  

1. 

выбрать

 

изображение

 

и

 

преобразовать

 

его

 

к

 

нужному

 

формату

2. 

передать

 

изображение

 

в

 OpenGL; 

3. 

определить

как

 

текстура

 

будет

 

наноситься

 

на

 

объект

 

и

 

как

 

она

 

будет

 

с

 

ним

 

взаимодействовать

4. 

связать

 

текстуру

 

с

 

объектом

5.1. 

Подготовка

 

текстуры

 

Для

 

использования

 

текстуры

 

необходимо

 

сначала

 

загрузить

 

в

 

память

 

нужное

 

изображение

 

и

 

передать

 

его

 OpenGL. 

Считывание

 

графических

 

данных

   

из

 

файла

 

и

 

их

 

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

 

можно

 

проводить

 

вручную

В

 

приложении

 D 

приведен

 

исходный

 

текст

 

функции

 

для

 

загрузки

 

изображения

 

из

 

файла

 

в

 

формате

 BMP.  

Можно

 

также

 

воспользоваться

 

функцией

входящей

 

в

 

состав

 

библиотеки

 GLAUX (

для

 

ее

 

использования

 

надо

 

дополнительно

 

подключить

 glaux.lib), 

которая

 

сама

 

проводит

 

необходимые

 

операции

Это

 

функция

 

AUX_RGBImageRec* 

auxDIBImageLoad

 (const char *

file

 


background image

 50

где

 

file

 – 

название

 

файла

 

с

 

расширением

 *.bmp 

или

 *.dib. 

Функция

 

возвращает

 

указатель

 

на

 

область

 

памяти

где

 

хранятся

 

преобразованные

 

данные

При

 

создании

 

образа

 

текстуры

 

в

 

памяти

 

следует

 

учитывать

 

следующие

 

требования

:  

Во

-

первых

размеры

 

текстуры

как

 

по

 

горизонтали

так

 

и

 

по

 

вертикали

 

должны

 

представлять

 

собой

 

степени

 

двойки

Это

 

требование

 

накладывается

 

для

 

компактного

 

размещения

 

текстуры

 

в

 

текстурной

 

памяти

 

и

 

способствует

 

ее

 

эффективному

 

использованию

Работать

 

только

 

с

 

такими

 

текстурами

 

конечно

 

неудобно

поэтому

 

после

 

загрузки

 

их

 

надо

 

преобразовать

Изменение

 

размеров

 

текстуры

 

можно

 

провести

 

с

 

помощью

 

команды

 

void 

gluScaleImage 

(GLenum 

format

, GLint 

widthin

,  

                    GL 

heightin

, GLenum 

typein

,  

                    const void *

datain

,  

                    GLint 

widthout

,  

                    GLint 

heightout

, GLenum 

typeout

,  

                    void *

dataout

 

В

 

качестве

 

значения

 

параметра

 

format

 

обычно

 

используется

 

значение

 

GL_RGB

 

или

 

GL_RGBA

определяющее

 

формат

 

хранения

 

информации

Параметры

 

widthin

heightin

widhtout

heightout

 

определяют

 

размеры

 

входного

 

и

 

выходного

 

изображений

а

 

с

 

помощью

 

typein

 

и

 

typeout

 

задается

 

тип

 

элементов

 

массивов

расположенных

 

по

 

адресам

 

datain

 

и

 

dataout

Как

 

и

 

обычно

это

 

может

 

быть

 

тип

 

GL_UNSIGNED_BYTE, GL_SHORT, GL_INT

 

и

 

так

 

далее

Результат

 

своей

 

работы

 

функция

 

заносит

 

в

 

область

 

памяти

на

 

которую

 

указывает

 

параметр

 

dataout

.  

Во

-

вторых

надо

 

предусмотреть

 

случай

когда

 

объект

 

после

 

растеризации

 

оказывается

 

по

 

размерам

 

значительно

 

меньше

 

наносимой

 

на

 

него

 

текстуры

Чем

 

меньше

 

объект

тем

 

меньше

 

должна

 

быть

 

наносимая

 

на

 

него

 

текстура

 

и

 

поэтому

 

вводится

 

понятие

 

уровней

 

детализации

 

текстуры

. (mipmap) 

Каждый

 

уровень

 

детализации

 

задает

 

некоторое

 

изображение

которое

 

является

как

 

правило

уменьшенной

 

в

 

два

 

раза

 

копией

 

оригинала

Такой

 

подход

  

позволяет

 

улучшить

 

качество

 

нанесения

 

текстуры

 

на

 

объект

Например

для

 

изображения

 

размером

 

2

m

x2

можно

 

построить

 max(m,n)+1 

уменьшенных

 

изображений

соответствующих

 

различным

 

уровням

 

детализации

.