2011-09-26 130 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