1

私のアプリケーションから奇妙な動作が見られます。説明していただければ幸いです。ご覧のとおり、フラグメント シェーダーに送信され、完全に正常にレンダリングされるこれら 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.
4

2 に答える 2

1

1D テクスチャと 3D テクスチャの両方を同じテクスチャ ユニットに同時にバインドしないでください。これを回避するには、1D テクスチャをバインドする前に、3D テクスチャのバインドを解除するかglBindTexture()、新しいテクスチャ ユニットに切り替えます。vtkgl::ActiveTexture()

上記のポスターが述べているように、への呼び出しはvtkgl::ActiveTexture()、対応するへの呼び出しの前に来なければなりませんglBindTexture()

于 2012-05-09T00:21:58.320 に答える