【发布时间】:2012-05-12 02:01:39
【问题描述】:
我有一个纹理,可以在上面渲染 16 幅图。纹理大小为 1024x1024,分为 4x4 的“槽”,每个槽为 256x256 像素。
在将新图形渲染到插槽之前,我想清除它,以便擦除旧图形并且插槽完全透明(alpha=0)。
有没有办法用 OpenGL 来做,或者我需要直接访问内存中的纹理像素并用 memset oslt 清除它们?
【问题讨论】:
我有一个纹理,可以在上面渲染 16 幅图。纹理大小为 1024x1024,分为 4x4 的“槽”,每个槽为 256x256 像素。
在将新图形渲染到插槽之前,我想清除它,以便擦除旧图形并且插槽完全透明(alpha=0)。
有没有办法用 OpenGL 来做,或者我需要直接访问内存中的纹理像素并用 memset oslt 清除它们?
【问题讨论】:
我想你会正常更新当前纹理:
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 也比重新创建新纹理要快。
【讨论】:
您的纹理是否主动绑定为帧缓冲区目标? (我假设是的,因为你说你正在渲染它。)
如果是这样,您可以设置 glScissor 测试,然后设置 glClear 以清除帧缓冲区的特定区域。
【讨论】: