Учитывая, что текстуры 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 (), чтобы разрешить запись только в альфа-канал. То, как вы на самом деле получаете данные в этот канал, зависит от того, что именно вы рисуете для создания этой маски.