ПрограммированиеСтатьиГрафика

Работа с расширениями OpenGL с использованием NVIDIA OpenGL SDK 5.1. (Часть 8)

Автор:

Расширения GL_EXT_texture_env_combine и GL_ARB_texture_env_combine
Примеры

Расширения GL_EXT_texture_env_combine и GL_ARB_texture_env_combine

Как известно, стандартный OpenGL обладает очень ограниченными возможностями по управлению наложением текстур – имеется всего 4 режима  (GL_REPLACE, GL_DECAL, GL_MODULATE и GL_BLEND), которые не допускают какой-либо настройки. Кроме того, не возможно установить разные режимы наложения для RGB и Alpha составляющих текстуры, что ещё сильнее сужает область применений стандартных режимов.

Поэтому разработчики стали ощущать потребность в гибких механизмах наложения текстур, и, в результате появилось расширение GL_EXT_texture_env_combine, а затем и GL_ARB_texture_env_combine. Различия между ними заключается в том, что расширение GL_ARB_texture_env_combine обладает немного большими возможностями, в результате чего, поддерживается меньшим числом старых видеокарт. К недостатку этих расширений можно отнести сложность их использования. В этой статье мы будем в основном использовать расширение GL_ARB_texture_env_combine.

Оба расширения не содержат каких-либо новых функций, следовательно, их не надо инициализировать. Но если вы попробуете проверить поддержку расширения GL_ARB_texture_env_combine при помощи функции glh_init_extensions, то вас будет ждать “знакомый” сюрприз – функция всегда будет сообщать, что расширение не поддерживается. Как вы уже догадались, всё дело в том, что создатели NV SDK забыли включить в файл “…\include\glh\extgen\extfile.txt” следующие строки:

GL_ARB_texture_env_combine {
}

После исправления этой ошибки и запуска проекта “…\include\glh\extgen\extgen.dsw” всё начинает работать как надо.

Расширение ARB_texture_env_combine добавляет новый режим наложения текстур: GL_COMBINE_ARB, который может быть включен командой

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB).

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

Формулы для  наложения для RGB и Alpha составляющих рассчитываемого цвета задаются командой

glTexEnvi(GL_TEXTURE_ENV, {цветовой компонент}, {выражение});

Цветовой компонент задаётся константами GL_COMBINE_RGB_ARB или GL_COMBINE_ALPHA_ARB, названия которых говорят за себя, а выражение – константой из таблицы 2.

Результат выражения можно умножить на 1, 2 или 4, путём задания соответствующего коэффициента масштабирования командой

glTexEnvi(GL_TEXTURE_ENV, {компонент цвета}, {коэффициент умножения})

где компонент цвета задаётся константами GL_RGB_SCALE_ARB  и GL_ALPHA_SCALE.
Константа  GL_REPLACE  GL_MODULATE  GL_ADD  GL_ADD_SIGNED_ARB  GL_INTERPOLATE_ARB  GL_SUBTRACT 
Выражение
Arg0
Arg0*Arg1
Arg0+Arg1
Arg0+Arg1-0.5
Arg0*Arg2+Arg1*(1-Arg2)
Arg0-Arg1

Таблица 2. Константы для задания выражений наложения текстуры на объект.

Выражения из таблицы можно понимать как шаблон: Arg0, Arg1 и Arg2  не какие-то фиксированные параметры – они задаются во время настройки расширения. Каждый параметр может принимать значение одной из следующих величин: цвет текстуры (Ct) или её альфа канал (At), первичный текст поверхности, заданный командой glColor,  (Cf) или её альфа канал (Af), поверхность, на которую накладывается текстура (Cp) или её альфа канал (Ap), или цвет, заданный при помощи команды glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, {указатель на цвет}) (Cc) и её альфа канал (Ac). При этом, в качестве параметра можно передавать как саму величину, так и значение “единица минус величина”.

Тип передаваемой величины указывается при помощи команды

glTexEnvi(GL_TEXTURE_ENV, {аргумент}, {величина, связываемая с аргументом})

Константы для задания {аргумента} и {тип величины, связываемой с аргументом} можно взять из таблиц 3 и 4 соответственно.


Константа  GL_SOURCE0_RGB_ARB  GL_SOURCE1_RGB_ARB  GL_SOURCE2_RGB_ARB  GL_SOURCE0_ALPHA_ARB  GL_SOURCE1_ALPHA_ARB  GL_SOURCE2_ALPHA_ARB 
Цветовой компонент  Аргумент
RGB  Arg0
RGB  Arg1
RGB  Arg2
ALPHA  Arg0
ALPHA  Arg1
ALPHA  Arg2

Таблица 3. Соответствие между константой и задаваемым аргументом.


Константа  GL_TEXTURE  GL_CONSTANT_ARB  GL_PRIMARY_COLOR_ARB  GL_PREVIOUS_ARB 
Тип величина
Цвет текстуры (Ct или At)
Константа (Cc или Ac)
Первичный цвет поверхности (Cf или  Af)
Цвет поверхности (Cp или Cp)

Таблица 4. Соответствие между константой и величиной, связываемой с аргументом

И, наконец, необходимо указать какой компонент задаваемой величины надо связать с параметром, и какую операцию надо над ним выполнить перед тем, как подставить его в качестве параметра в выражение из таблицы 2. Для этого используется команда

glTexEnvi(GL_TEXTURE_ENV, {аргумент}, {операция над аргументом})

Константы для задания {аргумента} и {операции над аргументом} приведены в таблицах 5 и 6 соответственно.


Константа  GL_OPERAND0_RGB_ARB  GL_OPERAND1_RGB_ARB  GL_OPERAND2_RGB_ARB  GL_OPERAND0_ALPHA_ARB  GL_OPERAND1_ALPHA_ARB  GL_OPERAND2_ALPHA_ARB 
Цветовой компонент  Аргумент
RGB  Arg0
RGB  Arg1
RGB  Arg2
ALPHA  Arg0
ALPHA  Arg1
ALPHA  Arg2

Таблица 5. Соответствие между константой и аргументом.


Константа  GL_SRC_COLOR  GL_ONE_MINUS_SRC_COLOR  GL_SRC_ALPHA  GL_ONE_MINUS_SRC_ALPHA 
Операция над аргументом
Получить RGB-компонент
Получить (1-RGB)
Получить альфа-компонент
Получить (1-ALPHA)

Таблица 6. Соответствие между константой и операцией, выполняемой над аргументом.

Если вам всё это кажется очень запутанным, не беспокойтесь – так и должно быть. После рассмотрения примеров всё встанет на свои места.

Страницы: 1 2 Следующая »

#OpenGL, #расширения

10 октября 2003

Комментарии [4]