我有一个纹理,可以在上面渲染 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
来清除帧缓冲区的特定区域。