2

如何通过动态纹理 C 有效地插入每个像素的两个纹理 A 和 B 并将它们绘制在一个简单的四边形上?接受多遍算法。

我在 CPU 上计算每帧 C 纹理并将其上传glTexImage2D到仅 alpha 纹理中取得了一定的成功。

虽然这行得通,但性能不足,我不得不将 C 的尺寸减小到全尺寸的一半,以绕过复制带宽瓶颈。

因此,出于性能原因,我尝试使用渲染到纹理进行所有 C 纹理更新。

我能够为渲染设置必要的缓冲区,但从根本上说,我得到了 RGB 或 RGBA 格式的纹理,其掩码以亮度/RGB 信息编码,而不是alpha

如何有效地将其转换为我需要插入纹理管道的 alpha 纹理?请记住,iPhone 上没有可编程管道(着色器)并且只有两个纹理单元可用。

更新: A 和 B 是纯 RGB 纹理,即没有 alpha。

4

1 回答 1

6

鉴于纹理 A 和 B 是 RGB 图像,那么也许您可以将其中之一制作成 RGBA 图像,并在一张图像的 Alpha 通道中渲染蒙版。这使您在 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”中可用。参见 GL 规范中的表 3.15)。

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

阅读 OpenGL ES 1.1 规范中的第 3.7.12 节纹理环境和纹理函数以获取完整信息。

要将场景实际渲染到图像的 Alpha 通道中,使用 glColorMask() 可能会有所帮助,以允许仅写入 Alpha 通道。您实际上如何将数据输入该通道实际上取决于您为生成该掩码而绘制的内容。

于 2009-06-16T20:20:32.363 回答