Интерполяция двух текстур третьей текстурой (фактор в легкости, не альфа) - PullRequest
2 голосов
/ 16 июня 2009

Как я могу эффективно интерполировать на пиксель две текстуры A и B с помощью динамической текстуры C и рисовать их на простом четырехугольнике? Приняты многоходовые алгоритмы.

Я добился умеренного успеха, вычисляя C-текстуру для каждого кадра на CPU и загружая ее с glTexImage2D в альфа-текстуру.

Хотя это работало, производительности не хватало, и мне пришлось уменьшить размеры C до половины полного размера, чтобы обойти узкое место пропускной способности копирования.

Итак, по соображениям производительности я пытаюсь сделать все свои обновления текстур C с использованием рендеринга в текстуру.

Мне удалось настроить необходимые буферы для рендеринга, но, по сути, я получаю текстуру в формате RGB или RGBA с маской, закодированной в lightness / RGB-информации, а не alpha .

Как мне эффективно преобразовать это в альфа-текстуру, которую мне нужно подключить к конвейеру текстурирования? Имейте в виду, что на iPhone нет программируемого конвейера (шейдеров) и только два текстурных блока.

Обновление: A и B являются текстурами только для RGB, т.е. без альфа.

1 Ответ

6 голосов
/ 17 июня 2009

Учитывая, что текстуры A и B являются изображениями RGB, возможно, вы сможете превратить одно из них в изображение RGBA и отобразить маску в альфа-канале одного изображения. Это позволяет получить в пределах iPhone два текстурных блока, что позволяет сделать это за один проход без наложения.

GLSL псевдокод:

vec4 a = texture2D(textureA, texcoord);
vec4 b = texture2D(textureB, texcoord);
gl_FragColor = vec4(a.rgb * a.a + b.rgb * (1-a.a), dont_care.a);

Текстурная среда для блока 0: (выборка изображения RGB B и передача его на следующий этап)

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureB);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

Текстурная среда для блока 1: (изображение B доступно в Cp и в источнике 'Ap'. A доступно в 'Cs'. Маска доступна в 'As'. См. Таблицу 3.15 в спецификации GL).

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textureA);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

Прочтите раздел 3.7.12 Текстурные среды и функции текстур в спецификации OpenGL ES 1.1 для полной информации.

Чтобы фактически визуализировать вашу сцену в альфа-канал изображения, может быть полезно использовать glColorMask (), чтобы разрешить запись только в альфа-канал. То, как вы на самом деле получаете данные в этот канал, зависит от того, что именно вы рисуете для создания этой маски.

...