【问题标题】:How to clear portion of a texture with alpha 0 using OpenGL ES?如何使用 OpenGL ES 清除具有 alpha 0 的纹理部分?
【发布时间】:2012-05-12 02:01:39
【问题描述】:

我有一个纹理,可以在上面渲染 16 幅图。纹理大小为 1024x1024,分为 4x4 的“槽”,每个槽为 256x256 像素。

在将新图形渲染到插槽之前,我想清除它,以便擦除旧图形并且插槽完全透明(alpha=0)。

有没有办法用 OpenGL 来做,或者我需要直接访问内存中的纹理像素并用 memset oslt 清除它们?

【问题讨论】:

    标签: opengl-es textures


    【解决方案1】:

    我想你会正常更新当前纹理:

    std::vector<unsigned char> emptyPixels(1024*1024*4, 0); // Assuming RGBA / GL_UNSIGNED_BYTE
    glBindTexture(GL_TEXTURE_2D, yourTextureId);
    glTexSubImage2D(GL_TEXTURE_2D,
                    0,
                    0,
                    0,
                    1024,
                    1024,
                    GL_RGBA,
                    GL_UNSIGNED_BYTE,
                    emptyPixels.data());  // Or &emptyPixels[0] if you're stuck with C++03
    

    即使您要替换每个像素,glTexSubImage2D 也比重新创建新纹理要快。

    【讨论】:

    • 谢谢。就在我按下“post”之后,我也想到了 glTexSubImage2D :-) 傻我……
    【解决方案2】:

    您的纹理是否主动绑定为帧缓冲区目标? (我假设是的,因为你说你正在渲染它。)

    如果是这样,您可以设置 glScissor 测试,然后设置 glClear 以清除帧缓冲区的特定区域。

    【讨论】:

    • 想知道这比 iPhone 3Gs+ 上的 glTexSubImage2D 快还是慢?很可能这两种方法都足够快,不会很重要......
    • glClear 会导致刷新吗?我以为是的,但我找不到支持我的参考。如果是这样,可能会影响性能。
    • @Mayoneez 似乎很容易尝试两种方式并亲自查看:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多