2011-02-22 49 views
5

我想寫一個類來做片段着色器鏈接通過使用幀緩衝區對象渲染到帶紋理着色器的紋理,然後使用片段着色器等渲染該紋理到另一個紋理等glDeleteTextures不刪除紋理

我正試圖處理內存泄漏,當我調整窗口大小並刪除/重新分配我正在使用的紋理時,紋理未被正確刪除。

下面的代碼片段:

//Allocate first texture 
glGenTextures(1, &texIds[0]); 
glBindTexture(GL_TEXTURE_2D, texIds[0]); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, screenX, screenY, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); 

//Allocate second texture 
glGenTextures(1, &texIds[1]); 
glBindTexture(GL_TEXTURE_2D, texIds[1]); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, screenX, screenY, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); 

//Try to free first texture -- ALWAYS FAILS 
glDeleteTextures(1, &texIds[0]); 
//Try to free second texture 
glDeleteTextures(1, &texIds[1]); 

當我跑這跟gDEBugger,它告訴我「警告:該調試程序刪除不存在的肌理質感名稱:1」當我嘗試刪除texIds [0]。 (我之所以把它們放在一個數組中,是因爲我曾經同時創建和釋放它們,但是當你一次釋放2個紋理時,它將在一個上靜默失敗並繼續執行另一個紋理)。

如果我不創建texIds [1],我可以釋放texIds [0],但只要創建第二個紋理,就不能再釋放我創建的第一個紋理。有任何想法嗎?

+0

該片段適用於我,當我將texIds聲明爲'GLuint texIds [2];'之前。也許問題在別處? – jakev 2011-02-22 23:24:48

+0

@ 6NSString奇怪。 glGetError()返回0,但是gDEBugger告訴我(並且如果我查看紋理查看器,則顯示我)有多餘的紋理正在創建。我正在運行OSX 10.6,如​​果這有幫助的話。我也會嘗試創建一個只包含這個代碼的程序。 – staticfloat 2011-02-22 23:51:32

+1

完全不相關的評論:要調整紋理的大小,您不需要刪除並重新生成整個紋理對象,只需使用新大小調用'glTexImage2D'即可。 – 2011-05-30 12:21:45

回答

1

也許錯誤在texIds數組中。它是GLUint的數組嗎?

您可能會錯誤地將其聲明爲單詞數組,因此在爲[1]元素生成紋理時,從元素[0]獲取的uint指針會被破壞。