私のアプリケーションから奇妙な動作が見られます。説明していただければ幸いです。ご覧のとおり、フラグメント シェーダーに送信され、完全に正常にレンダリングされるこれら 2 つの 3D テクスチャがあります。しかし、問題があります。別のテクスチャ (1D テクスチャ) を作成するとすぐに、以前の正しい結果ではなく、黒い画面がレンダリングされます。
この 1D テクスチャについては、フラグメント シェーダーにも送信していません。glTexImage1D(…) を呼び出すと、黒い画面が表示されます。この行にコメントすると消えます!!そして、2 つのテクスチャがレンダリングされます。
テクスチャ ユニットに何らかの問題があるに違いないと考えました。gDebugger を使用してアプリケーションを実行すると、3D テクスチャの 1 つのテクスチャ ユニットが 1D テクスチャに割り当てられたものと同じになるためです。
1D テクスチャにテクスチャ ユニットを割り当てず、作成しただけです。どうやらテクスチャ ユニット GL_TEXTURE0 が 1D テクスチャに自動的に割り当てられているようです。奇妙な点は、3D テクスチャに GL_TEXTURE2 と GL_TEXTURE3 を使用しているにもかかわらず、glTexImage1D を呼び出した結果、そのうちの 1 つが GL_TEXTURE0 にバインドされていることです。
以下は、gDebugger のテクスチャ リスト ウィンドウのスナップショットです。
テクスチャ 1 (ユニット 2、bound3d) 有効 テクスチャ 2 (ユニット 0、bound1d) テクスチャ 3 (ユニット 0、bound3d) 有効 (ユニット 3、bound3D) 有効
なぜこうなった?
問題は、テクスチャ 1D が GL_TEXTURE0 にバインドされている理由ではなく、すでにバインドされている別のテクスチャの状態に影響を与える可能性があるためです。コードは次のようになります。
...
// generating the first texture_3d
glTexImage(GL_TEXTURE_3D,....);
glBindTexture(GL_TEXTURE_3D,id1);
//render loop for the first texture_3d
GLuint glEnum = GL_TEXTURE2;
vtkgl::ActiveTexture(glEnum);
glBindTexture(vtkgl::TEXTURE_3D,id1);
program->setUniform("TEX1",2);
// generating the second texture_3d
glTexImage(GL_TEXTURE_3D,....);
glBindTexture(GL_TEXTURE_3D,id2);
//render loop for the first texture_3d
GLuint glEnum = GL_TEXTURE3;
vtkgl::ActiveTexture(glEnum);
glBindTexture(vtkgl::TEXTURE_3D,id2);
program->setUniform("TEX2",3);
// generating texture 1D
glTexImage(GL_TEXTURE_1D,....);
glBindTexture(GL_TEXTURE_1D,id3);
we expect GL_TEXTURE2 and GL_TEXTURE3 to be active but gDebugger indicates that GL_TEXTURE0 and GL_TEXTURE2 are active.