用第三个纹理对两个纹理进行插值(因素是亮度,而不是 Alpha)

发布于 2024-07-24 20:35:03 字数 506 浏览 8 评论 0原文

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

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

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

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

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

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

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

How can I efficently interpolate per-pixel two textures A and B by a dynamic texture C and draw them on a simple quad? Multi-pass algorithms accepted.

I've had moderate success calculating the C texture per-frame on the CPU and uploading it with glTexImage2D into an alpha-only texture.

While this worked, performance was lacking and I had to reduce the dimensions of C to half of the full size to get around the copying bandwidth bottleneck.

So, for performance reasons, I'm trying to do all of my C texture updates using render-to-texture.

I was able to set up the necessary buffers for rendering, but fundamentally, I get a texture in RGB or RGBA format with the mask encoded in lightness/RGB information, not alpha.

How do I convert this efficiently into the alpha texture I need to plug into the texturing pipeline? Keep in mind that there is no programmable pipeline (shaders) and only two texture units available on the iPhone.

Update:
A and B are RGB-only textures, ie no alpha.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怕倦 2024-07-31 20:35:03

假设纹理 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 通道。 如何将数据实际获取到该通道实际上取决于您正在绘制以生成该掩码的内容。

Given that textures A and B are RGB images, then perhaps you can make one of them into an RGBA image, and render the mask in the alpha channel of one image. This gets you within the iPhone's limit of two texture units, allowing you to do this in one pass, without blending.

GLSL pseudocode:

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);

Texture Environment for Unit 0: (samples RGB image B, and passes it on to the next stage)

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

Texture Environment for Unit 1: (image B are available in Cp and 'Ap' source. A is available in 'Cs'. Mask is available in 'As'. see Table 3.15 in the GL spec).

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

Read section 3.7.12 Texture Environments and Texture Functions in the OpenGL ES 1.1 spec for full information.

To actually render your scene into the alpha channel of the image, it may be helpful to use glColorMask(), to allow writing to only the alpha channel. How you actually get the data into that channel really depends on exactly what you're drawing to generate that mask.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文