2011-09-26 89 views
0

我使用代码象下面来更新文本(在一个位图)动态到纹理:绘图文本与透明背景

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

代码中的其他地方实际上存在一个错误。
texSubImage2D实际上替换了给定区域中的所有纹理数据。新纹理在旧图形上的绘制出现在位图/画布上。
canvas.drawColor()当应该使用bitmap.eraseColor()时,错误地使用了调用来清除位图。

0

答案很简单。你在旧的纹理上绘制一个新的纹理,这是所需的行为(因为你想创建一个纹理的组合)。

您应该先删除旧纹理(quote from this doc)。


清理纹理对象

当你绑定和取消绑定纹理对象,他们的数据依然坐在那里某处你的纹理资源之一。如果纹理资源有限,删除纹理可能是释放资源的一种方法。

void glDeleteTextures(GLsizei n, const GLuint *textureNames)
删除N个纹理的物体,通过在阵列textureNames元素命名。释放的纹理名称现在可以重用(例如,通过glGenTextures())。 如果删除了当前绑定的纹理,则绑定将恢复为默认纹理,就像glBindTexture()对于textureName的值调用0一样。试图删除不存在的纹理名称或零的纹理名称将被忽略而不会产生错误。

+0

谢谢!我希望能有一种方法来清除和更新纹理的特定区域,以使更新更有效,但我想唯一的方法是每次应该部分更改时删除和创建整个纹理。 – bit8