2

私は WebGL (≈ OpenGL ES 2.0) を使用しています。現在、私のアプリケーションではテクスチャ ユニット 0 をモデルごとのテクスチャとして使用し、1 と 2 をシェーダーが使用する定数テクスチャとして使用しています。

テクスチャをロードしてセットアップするには、

var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(...);
gl.texParameteri(...);

ただし、これは、現在のテクスチャ ユニットにバインドされているテクスチャの状態を踏みにじります。このプログラムを回避するために、追加しました

gl.activeTexture(gl.TEXTURE0);

ジオメトリを描画する前にリセットされるテクスチャ ユニット 0 のバインディングにのみ影響するように、上記のコードの先頭に追加します。

たまたま「スクラッチ」テクスチャ ユニットを利用できるようにする必要のない、より良いアプローチはありますか? この状態管理の問題に対する確立されたベスト プラクティスはありますか?

4

1 に答える 1

1

私にとって、この問題は他のいくつかの問題と同じカテゴリに分類されます。プログラムの特定の時点での GL 状態について、どのようなことが想定できますか?

AFAICTには、基本的に2つのオプションがあります。

  1. 何も仮定せず、必要な方法で状態を設定します。つまりglActiveTextrure()、現在行っているように呼び出します
  2. プログラムの特定の時点で GL がどのような状態になるべきかについてのルールを設定します。たとえば、あなたの場合、glActiveTexture(gl.TEXTURE0)完了時に描画部分を呼び出すようにして、事前描画部分がそのように設定されていると想定できるようにします。

しかし、実際には、あまり考えないでください。OpenGL では、関数呼び出しに対するポリゴンの比率を (実際的な制限内で) 最大化することによってプログラムを最適化します。これは、多くのポリゴンを渡してglDrawArrays()呼び出しなどを行うことによっても行うことができます。

于 2012-04-28T17:18:44.133 に答える