12

次のようなものがあるとします。

glBindTexture(GL_TEXTURE_2D, my2dTex);
glBindTexture(GL_TEXTURE_1D, my1dTex);
glBegin...

正しい OpenGL の動作は何ですか? 1D テクスチャ、2D、またはその両方を描画するには? アクティブなテクスチャごとに、実際に同時にバインドできる複数のテクスチャがありますか (つまり、1D、2D、3D キューブ マップなど)?

4

3 に答える 3

14

バインディングの GL 状態は、ターゲット(つまり、1D/2D/3D/cube) ごとに 1 つのテクスチャ名です。だから電話するときは

glBindTexture(GL_TEXTURE_2D, my2dTex)
glBindTexture(GL_TEXTURE_1D, my1dTex)

GL は両方の設定を記憶します。

さて、どちらの GL を使用するかの答えは、シェーダーをオンにしているかどうかによって異なります。

シェーダーがオンの場合、GL はシェーダーが使用するように指示したものを使用します。(sampler1d/sampler2d... に基づく)。

シェーダーがオンになっていない場合は、最初にどの glEnable 呼び出しが行われたかによって異なります。

glEnable(GL_TEXTURE_2D)
glEnable(GL_TEXTURE_1D)

両方が有効になっている場合、仕様に静的な優先順位ルールがあります (GL 1.5 仕様の 3.8.15 テクスチャ アプリケーション)。

Cube > 3D > 2D > 1D

したがって、両方のテクスチャ ターゲットが有効になっている場合、2D ターゲットが使用されます。

余談ですが、シェーダーはテクスチャ ターゲットが有効かどうかを気にしないことに注意してください...

編集して追加:

そして、本当にザラザラした詳細に到達したい人のために、各ターゲット * 各ユニットに常にテクスチャがバインドされています。名前 0 (バインド状態のデフォルト) は、ターゲットごとに 1 つの一連のテクスチャ オブジェクトに対応します。どちらもテクスチャをバインドしますが、同じものではありませんglBindTexture(GL_TEXTURE_2D, 0)...glBindTexture(GL_TEXTURE_1D, 0)

これは歴史的なもので、テクスチャ オブジェクトがまだ存在していなかった GL 1.0 の動作に一致するように指定されています。ただし、GL3.0 での非推奨がこれで何をしたのかはわかりません。

于 2010-05-07T07:33:44.350 に答える
0

適用されるテクスチャは、BindTextureルーチンで最後に指定されたものです。

仕様から:

ターゲットにバインドされた新しいテクスチャオブジェクトは、削除されるまで、ターゲットによって指定された次元とタイプのテクスチャのままです。....バインドが成功した場合、バインドされたテクスチャオブジェクトの状態は変更されず、ターゲットへの以前のバインドはすべて解除されます。

実際、あなたの例では、アクティブなテクスチャユニットの状態を「上書き」するため、1Dテクスチャが適用されます。

于 2010-05-07T06:04:38.313 に答える
0

1dテクスチャが描画されると思います。私の知る限り、各テクスチャ ユニットは一度に 1 つのテクスチャしかバインドできません。テクスチャの次元数は実際には入りません。

複数のテクスチャをバインドするには、次のように (glActiveTexture を使用して) 複数のテクスチャ ユニットをアクティブにする必要があります。

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, my2dTex);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_1D, my1dTex);

ただし、これは OpenGL 2.1 に関する私の知識によるものなので、新しいバージョンで派手な新しいテクスチャ拡張機能が導入された場合は修正してください。

于 2010-05-07T04:21:10.927 に答える