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

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

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

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

Добавлен: 09.06.2020

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

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

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

 56

void 

glTexGen[i f d]v

 (GLenum 

coord

, GLenum 

pname

                       const GLtype *

params

 

Параметр

 

coord

 

определяет

для

 

какой

 

координаты

 

задается

 

формула

и

 

может

 

принимать

 

значение

 

GL_S,GL_T

pname

 

может

 

быть

 

равен

 

одному

 

из

 

следующих

 

значений

GL_TEXTURE_GEN_MODE 

определяет

 

функцию

 

для

 

наложения

 

текстуры

В

 

этом

 

случае

 

аргумент

 

param

 

принимает

 

значения

:

 

GL_OBJECT_LINEAR

   

значение

 

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

 

текстурной

 

координаты

 

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

 

расстоянием

 

до

 

плоскости

задаваемой

 

с

 

помощью

 

значения

 

pname 

GL_OBJECT_PLANE

  (

см

ниже

). 

Формула

 

выглядит

 

следующим

 

образом

g=x*xp+y*yp+z*zp+w*wp, 

где

 g–

соответвующая

 

текстурная

 

координата

 (s 

или

 

p), x, y, z, w – 

координаты

 

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

 

точки

. xp, yp, zp, wp – 

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

 

уравнения

 

плоскости

В

 

формуле

 

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

 

координаты

 

объекта

GL_EYE_LINEAR

 

аналогично

 

предыдущему

 

значению

только

 

в

 

формуле

 

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

 

видовые

 

координаты

Т

.

е

координаты

 

текстуры

 

объекта

 

в

 

этом

 

случае

 

зависят

 

от

 

положения

 

этого

 

объекта

GL_SPHERE_MAP

 

позволяет

 

эмулировать

 

отражение

 

от

 

поверхности

 

объекта

Текстура

 

как

 

бы

 

"

оборачивается

вокруг

 

объекта

Для

 

данного

 

метода

 

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

 

видовые

 

координаты

 

и

 

необходимо

 

задание

 

нормалей

.

 

GL_OBJECT_PLANE

   

позволяет

 

задать

 

плоскость

расстояние

 

до

 

которой

 

будет

 

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

 

при

 

генерации

 

координат

если

 

установлен

 

режим

 

GL_OBJECT_LINEAR

В

 

этом

 

случае

 

параметр

 

params

 

является

 

указателем

 

на

 

массив

 

из

 

четырех

 

коэффициентов

 

уравнения

 

плоскости


background image

 57

GL_EYE_PLANE 

аналогично

 

предыдущему

 

значению

Позволяет

 

задать

 

плоскость

 

для

 

режима

 

GL_EYE_LINEAR

 

Для

 

установки

 

автоматического

 

режима

 

задания

 

текстурных

 

координат

 

необходимо

 

вызвать

 

команду

 

glEnable

 

с

 

параметром

 

GL_TEXTURE_GEN_S

 

или

 

GL_TEXTURE_GEN_P

Программа

использующая

 

наложение

 

текстуры

 

и

 

анимацию

приведена

 

в

 

приложении

 D.3 

Контрольные

 

вопросы

 

1. 

Что

 

такое

 

текстура

 

и

 

для

 

чего

 

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

 

текстуры

2. 

Что

 

такое

 

текстурные

 

координаты

 

и

 

как

 

задать

 

их

 

для

 

объекта

3. 

Какой

 

метод

 

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

 

с

 

материалом

 (GL_MODULATE, 

GL_REPLACE) 

нужно

 

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

если

 

текстура

 

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

 

собой

 

картину

висящую

 

на

 

стене

4. 

Перечислите

 

известные

 

вам

 

методы

 

генерации

 

текстурных

 

координат

 

в

 OpenGL. 

5. 

Для

 

чего

 

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

 

уровни

 

детализации

 

текстуры

 (mip-

mapping)? 

6. 

Что

 

такое

 

режимы

 

фильтрации

 

текстуры

 

и

 

как

 

задать

 

их

 

в

 

OpenGL? 


background image

 58

Глава

 6  

 

Операции

 

с

 

пикселями

 

После

 

проведения

 

всех

 

операций

 

по

 

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

 

координат

 

вершин

вычисления

 

цвета

 

и

 

т

.

п

., OpenGL 

переходит

 

к

 

этапу

 

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

на

 

котором

 

происходит

  

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

 

всех

 

примитивов

наложение

 

текстуры

наложение

 

эффекта

 

тумана

Для

 

каждого

 

примитива

 

результатом

 

этого

 

процесса

 

является

   

занимаемая

 

им

 

в

 

буфере

 

кадра

 

область

каждому

 

пикселю

 

этой

 

области

 

приписывается

 

цвет

 

и

 

значение

 

глубины

OpenGL 

использует

 

эту

 

информацию

чтобы

 

записать

 

обновленные

 

данные

 

в

 

буфер

 

кадра

Для

 

этого

 OpenGL 

имеет

 

не

 

только

 

отдельный

 

конвейер

 

обработки

 

пикселей

но

 

и

 

несколько

 

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

 

буферов

 

различного

 

назначения

Это

 

позволяет

 

программисту

 

гибко

 

контролировать

 

процесс

 

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

 

на

 

самом

 

низком

 

уровне

Графическая

 

библиотека

 OpenGL 

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

 

работу

 

со

 

следующими

 

буферами

 

несколько

 

буферов

 

цвета

 

 

буфер

 

глубины

 

 

буфер

-

накопитель

 (

аккумулятор

 

буфер

 

маски

 

Группа

 

буферов

 

цвета

 

включает

 

буфер

 

кадра

но

 

таких

 

буферов

 

может

 

быть

 

несколько

При

 

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

 

двойной

 

буферизации

 

говорят

 

о

 

рабочем

 (front) 

и

 

фоновом

 (back) 

буферах

Как

 

правило

в

 

фоновом

 

буфере

 

программа

 

создает

 

изображение

которое

 

затем

 

разом

 

копируется

 

в

 

рабочий

 

буфер

На

 

экране

 

может

 

появиться

 

информация

 

только

 

из

 

буферов

 

цвета

Буфер

 

глубины

 

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

 

для

 

удаления

 

невидимых

 

поверхностей

 

и

 

прямая

 

работа

 

с

 

ним

 

требуется

 

крайне

 

редко

Буфер

-

накопитель

 

можно

 

применять

 

для

 

различных

 

операций

Более

 

подробно

 

работа

 

с

 

ним

 

описана

 

в

 

разделе

 6.2. 


background image

 59

Буфер

 

маски

 

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

 

для

 

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

 

пиксельных

 

масок

 

(

трафаретов

), 

служащих

 

для

 

вырезания

 

из

 

общего

 

массива

 

тех

 

пикселей

которые

 

следует

 

вывести

 

на

 

экран

Буфер

 

маски

 

и

 

работа

 

с

 

ним

 

более

 

подробно

 

рассмотрены

 

в

 

разделах

 6.3, 7.2 

и

 7.3. 

6.1. 

Смешивание

 

изображений

Прозрачность

 

Разнообразные

 

прозрачные

 

объекты

 – 

стекла

прозрачная

 

посуда

 

и

 

т

.

д

часто

 

встречаются

 

в

 

реальности

поэтому

 

важно

 

уметь

 

создавать

 

такие

 

объекты

 

в

 

интерактивной

 

графике

. OpenGL 

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

 

программисту

 

механизм

 

работы

 

с

 

полупрозрачными

 

объектами

который

 

и

 

будет

 

кратко

 

описан

 

в

 

этом

 

разделе

Прозрачность

 

реализуется

 

с

 

помощью

 

специального

 

режима

 

смешения

 

цветов

 (blending). 

Алгоритм

 

смешения

 

комбинирует

 

цвета

 

так

 

называемых

 

входящих

 

пикселей

  (

т

.

е

. «

кандидатов

» 

на

 

помещение

 

в

 

буфер

 

кадра

)  

с

 

цветами

 

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

 

пикселей

уже

 

хранящихся

 

в

 

буфере

Для

 

смешения

 

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

 

четвертая

 

компонента

 

цвета

 – 

альфа

-

компонента

поэтому

 

этот

 

режим

 

называют

 

еще

 

альфа

-

смешиванием

Программа

 

может

 

управлять

 

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

 

альфа

-

компоненты

 

точно

 

так

 

же

как

 

и

 

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

 

основных

 

цветов

т

.

е

задавать

 

значение

 

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

 

для

 

каждого

 

пикселя

 

или

 

каждой

 

вершины

 

примитива

Режим

 

включается

 

с

 

помощью

 

команды

 

glEnable(GL_BLEND)

Определить

 

параметры

 

смешения

 

можно

 

с

 

помощью

 

команды

void 

glBlendFunc

(enum 

src

,enum 

dst

 

Параметр

 

src

 

определяет

как

 

получить

 

коэффициент

  k

1

 

исходного

 

цвета

 

пикселя

, a 

dst

 

задает

 

способ

 

получения

 

коэффициента

 k

2

 

для

 

цвета

 

в

 

буфере

 

кадра

Для

 

получения

 

результирующего

 

цвета

 

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

 

следующая

 

формула

: res=

с

src

*k

1

+c

dst

*k

2

где

 

с

src  

 – 

цвет

 

исходного

 

пикселя

, c

dst 

 – 

цвет

 

пикселя

 

в

 

буфере

 

кадра

 (res, k

1

, k

1

с

src,

  c

dst  

 – 

четырехкомпонентные

 RGBA-

векторы

). 

Приведем

 

наиболее

 

часто

 

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

 

значения

 

агрументов

 

src

 

и

 

ds

t. 

GL_SRC_ALPHA    

k=(A

s

,A

s

,A

s

,A

s

)

 

GL_SRC_ONE_MINUS_ALPHA 

k=(1,1,1,1)-(A

s

,A

s

,A

s

,A

s

)

 

GL_DST_COLOR    

k=(R

d

,G

d

,B

d

)

 


background image

 60

GL_ONE_MINUS_DST_COLOR 

k

=

(1,1,1,1)- (R

d

,G

d

,B

d

,

А

d

)

 

GL_DST_ALPHA    

k=(A

d

,A

d

,A

d

,A

d

)

 

GL_DST_ONE_MINUS_ALPHA  

k=(1,1,1,1)-(A

d

,A

d

,A

d

,A

d

)

 

GL_SRC_COLOR    

k=(R

s

,G

s

,B

s

)

 

GL_ONE_MINUS_SRC_COLOR 

k

=

(1,1,1,1)- (R

s

,G

s

,B

s

,A

s

)

 

Пример

Предположим

мы

 

хотим

 

реализовать

 

вывод

 

прозрачных

 

объектов

Коэффициент

 

прозрачности

 

задается

 

альфа

-

компонентой

 

цвета

Пусть

 1 

– 

непрозрачный

 

объект

; 0 – 

абсолютно

 

прозрачный

т

.

е

невидимый

Для

 

реализации

 

служит

 

следующий

 

код

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA,GL_SRC_ONE_MINUS_ALPHA); 
 

Например

полупрозрачный

 

треугольник

 

можно

 

задать

 

следующим

 

образом

glColor3f(1.0, 0.0, 0.0, 0.5); 
glBegin(GL_TRIANGLES);  
  glVertex3f(0.0, 0.0, 0.0);  
  glVertex3f(1.0, 0.0, 0.0);  
  glVertex3f(1.0, 1.0, 0.0);  
glEnd(); 

 

Если

 

в

 

сцене

 

есть

 

несколько

 

прозрачных

 

объектов

которые

 

могут

 

перекрывать

 

друг

 

друга

корректный

 

вывод

 

можно

 

гарантировать

 

только

 

в

 

случае

 

выполнения

 

следующих

 

условий

 

Все

 

прозрачные

 

объекты

 

выводятся

 

после

 

непрозрачных

 

При

 

выводе

 

объекты

 

с

 

прозрачностью

 

должны

 

быть

 

упорядочены

 

по

 

уменьшению

 

глубины

т

.

е

выводиться

начиная

 

с

 

наиболее

 

отдаленных

 

от

 

наблюдателя

В

 OpenGL 

команды

 

обрабатываются

 

в

 

порядке

 

их

 

поступления

поэтому

 

для

 

реализации

 

перечисленных

 

требований

 

достаточно

 

расставить

 

в

 

соответствующем

 

порядке

 

вызовы

 

команд

 glVertex*(), 

но

 

и

 

это

 

в

 

общем

 

случае

 

нетривиально