2015-04-15 48 views
1

我正面臨着一個奇怪的問題,我以一個未定義的,但某種程度上有效的紋理結束。應用此紋理的網格是黑色的。此紋理的glIsTexture(textureId)方法返回1(!),但紋理顯然是錯誤的。它有未定義的大小。glGenTextures在glDeleteTextures後不久返回一個未定義紋理

我的iOS應用程序在短時間間隔內創建幾個紋理,但始終在主線程上。所描述的情況是不尋常的,難以再現和它僅發生在當一個特定的場景:

  • 有用於glDeleteTextures(1, &textureId),刪除一個紋理ID = N
  • 在短時間(〜0.05秒)有用於glGenTextures(1, &textureId)並且該函數返回一個新的紋理,其中id = N與最近刪除的紋理完全相同。

在我看來,像OpenGL驅動程序試圖創建一個新的紋理,而舊的沒有完全擦除。那可能嗎?

+2

聽起來GL實施正在回收紋理ID。那有什麼問題? –

+0

應用了紋理的網格顯示黑色表示您的紋理設置有誤,並且着色器正在讀取每個紋理樣本的0。 –

+0

@節奏 - 回收ID非常好。問題是,在非常罕見的情況下,當ID在短時間間隔內回收時,新紋理是黑色的,沒有定義尺寸,但是有效(glIsTexture(textureId)返回1)。 – Greg

回答

1

這個問題很簡單 - 在調用glTexImage2D並設置紋理之前,這是一個不受限制的紋理。

我在OpenGL庫上使用了一組包裝器方法。其目的是減少驅動程序冗餘狀態更改的次數。其中一個包裝器阻止將具有相同ID的紋理綁定到紋理單元,如果它以前被標記爲綁定。

在某些情況下,當相同的ID被回收時,包裝方法仍舊「記住」舊的紋理ID並且再次阻止綁定。

重新顯示 - 在這種情況下,glDeleteTextures後跟glGenTextures完全沒有問題。