【问题标题】:Interpolating two textures by a third texture (factor is in lightness, not alpha)通过第三个纹理插值两个纹理(因素是亮度,而不是 alpha)
【发布时间】:2011-03-16 18:59:23
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: iphone opengl-es render-to-texture


    【解决方案1】:

    鉴于纹理 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);
    

    Unit 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 通道。您实际上如何将数据输入该通道实际上取决于您为生成该蒙版而绘制的内容。

    【讨论】:

    • 很棒的帖子。正在考虑做类似的事情。 A 和 B 都没有 Alpha 通道。如何“将 C 渲染到一张图像的未使用的 alpha 通道中”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2019-06-17
    • 2016-07-16
    • 2016-07-16
    • 2013-05-07
    相关资源
    最近更新 更多