1

OpenGL のテクスチャの 1 つでひどい動作が発生しました。

テクスチャを削除した後、新しいテクスチャを作成すると、以前と同じ tex 番号が生成されますが、テクスチャが正しくありません。また、glGetError はすべての行で常に 0 を返します。glDeleteTextures の後に glFlush/glFinish を追加しようとしましたが、何も変わりません! テクスチャ番号がどこかでロックされているようです...なぜですか?

シングルスレッドです。ここでの動作は次のとおりです。

//myTexture == 24 is loaded and works correctly
GLboolean bIsTexture = glIsTexture(myTexture); //returns 1 = > ok
glDeleteTextures(1,&myTexture);
bIsTexture = glIsTexture(myTexture); //returns 0 => ok

//Let's create a new texture
glGenTextures(1,&myTexture);//myTexture == 24 (as the glDelete was ok)
glBindTexture(GL_TEXTURE_2D,myTexture);     
bIsTexture = glIsTexture(myTexture); //returns 0 => FAILS
4

3 に答える 3

6

すでにバインドされているテクスチャを作成する前に、BindTexture を 0 に呼び出します。

//Let's create a new texture
glBindTexture(GL_TEXTURE_2D,0); // free the old bind texture if deleted
glGenTextures(1,&myTexture);//myTexture == 24 (as the glDelete was ok)
glBindTexture(GL_TEXTURE_2D,myTexture);     
bIsTexture = glIsTexture(myTexture); //returns 1 => Ok
于 2013-09-06T07:48:44.053 に答える
2

新しいテクスチャを作成するために一般的に使用される一連の操作で、重要なステップが 1 つ欠けています。それは、実際にテクスチャを割り当てることです。

//Let's create a new texture

glGenTextures(1,&myTexture);//myTexture == 24 (as the glDelete was ok)
glBindTexture(GL_TEXTURE_2D,myTexture);     

ここで glTexImage2D または glTexStorage を呼び出して、実際にテクスチャ オブジェクトを割り当てる必要があります。そうする前は、生成されたテクスチャ名に関連付けられたテクスチャデータはありません。これは重要です: glGenTextures によって生成された値はtexturesではなく、テクスチャ(つまり、ハンドル) であり、OpenGL はこれが既にテクスチャ オブジェクトである必要があると述べていますが、バグのあるドライバーはそれを間違って解釈する可能性があります。

glTexImage2D(…); // <<<<<
bIsTexture = glIsTexture(myTexture); //returns …

アップデート:

Andon M. Coleman が指摘しているように (ありがとう)、テクスチャ名をテクスチャ ターゲットにバインドすると、テクスチャ オブジェクトが作成されます (その名前に関連付けられています)。したがって、その場合、glIsTexture が GL_TRUE を返すことを期待する必要があります。ここで、現実が仕様の理想的な世界とどのように異なるかを示します。実際の (バグのある) ドライバーは正しく実装されておらず、実際のデータ ストレージが存在する場合にのみテクスチャ オブジェクトに関連付けられている名前を想定している可能性があります。割り当てて効果を確認します。

実際には、通常、名前の割り当ての直後にストレージの割り当てを行います。ドライバーの実装者が使用したテスト スイートは、このコーナー ケースをチェックしていないと思います。バグレポートを書く時間です。

于 2013-09-05T17:14:57.133 に答える