我使用下面的代码将文本(在位图中)动态更新为纹理:
public void UpdateTexture(GL10 gl, int x, int y, int textureId, Bitmap bitmap)
{
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
GLUtils.texSubImage2D(GL10.GL_TEXTURE_2D, 0, x, y, bitmap);
}
问题是texSubImage2D函数并不能完全替换纹理中的现有像素,但它会保留现有信息并在其上绘制新的位图。并且因为新位图具有透明像素,所以在渲染纹理时,旧位图将显示在其下方。有没有办法在texSubImage2D调用之前从纹理中完全擦除目标区域的旧信息?
答案 0 :(得分:0)
答案很简单。您在旧的纹理上绘制一个新纹理,这是所需的行为(因为您希望使用组合创建纹理)。
您应首先删除旧纹理(quote from this doc)。
<小时/> 清理纹理对象
在绑定和取消绑定纹理对象时,它们的数据仍然位于纹理资源中的某个位置。如果纹理资源有限,删除纹理可能是释放资源的一种方法。
void glDeleteTextures(GLsizei n, const GLuint *textureNames)
:
删除n个纹理对象,由数组textureNames中的元素命名。现在可以重用释放的纹理名称(例如,通过glGenTextures())。
如果删除当前绑定的纹理,则绑定将恢复为默认纹理,就像glBindTexture()被调用为textureName的值为零一样。尝试删除不存在的纹理名称或纹理名称为零将被忽略,而不会生成错误。
答案 1 :(得分:0)
代码中的其他地方确实存在错误
texSubImage2D
实际上替换了给定区域中的所有纹理数据。新纹理在旧位图上的绘制发生在位图/画布一侧
错误地使用了canvas.drawColor()
调用来在应该使用bitmap.eraseColor()
时清除位图。