Работа с расширениями 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.
Выражение |
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 соответственно.
Цветовой компонент | Аргумент |
RGB | Arg0 |
RGB | Arg1 |
RGB | Arg2 |
ALPHA | Arg0 |
ALPHA | Arg1 |
ALPHA | Arg2 |
Таблица 3. Соответствие между константой и задаваемым аргументом.
Тип величина |
Цвет текстуры (Ct или At) |
Константа (Cc или Ac) |
Первичный цвет поверхности (Cf или Af) |
Цвет поверхности (Cp или Cp) |
Таблица 4. Соответствие между константой и величиной, связываемой с аргументом
И, наконец, необходимо указать какой компонент задаваемой величины надо связать с параметром, и какую операцию надо над ним выполнить перед тем, как подставить его в качестве параметра в выражение из таблицы 2. Для этого используется команда
glTexEnvi(GL_TEXTURE_ENV, {аргумент}, {операция над аргументом})
Константы для задания {аргумента} и {операции над аргументом} приведены в таблицах 5 и 6 соответственно.
Цветовой компонент | Аргумент |
RGB | Arg0 |
RGB | Arg1 |
RGB | Arg2 |
ALPHA | Arg0 |
ALPHA | Arg1 |
ALPHA | Arg2 |
Таблица 5. Соответствие между константой и аргументом.
Операция над аргументом |
Получить RGB-компонент |
Получить (1-RGB) |
Получить альфа-компонент |
Получить (1-ALPHA) |
Таблица 6. Соответствие между константой и операцией, выполняемой над аргументом.
Если вам всё это кажется очень запутанным, не беспокойтесь – так и должно быть. После рассмотрения примеров всё встанет на свои места.
10 октября 2003
Комментарии [4]