2012-04-28 10 views
2

私はWebGL(≈OpenGL ES 2.0)を使用しています。現時点では、私のアプリケーションでは、テクスチャユニット0がモデルごとのテクスチャとして使用され、1と2はシェーダが使用する定数テクスチャとして使用されています。テクスチャの初期化に関してglActiveTextureをどのように管理すればよいですか?

ロードし、テクスチャを設定するために、私は

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

を行うしかし、これは、テクスチャが現在のテクスチャユニットに結合している状態でstomps。それだけで、とにかくあらゆるジオメトリを描画する前にリセットされ、テクスチャユニット0のための結合に影響するように、このプログラムを避けるために、私は、上記のコードの先頭に

gl.activeTexture(gl.TEXTURE0); 

を追加しました。

「スクラッチ」テクスチャユニットを使用できるようになることはありません。この状態管理の問題には、ベストプラクティスが確立されていますか?

答えて

1

私にとっては、この問題は他のいくつかのカテゴリーと同じです:プログラムの特定のポイントでGL状態について何を想定できますか?あなたは基本的に2つのオプションがあり

AFAICT:

  1. は何を負いませんし、状態にあなたがそれを必要とする方法を設定します。あなたが現在行っているようにglActiveTextrure()を呼び出してください。
  2. あなたのプログラムの特定のポイントでGLがどんな状態にあるべきかに関するルールを設定します。例えばあなたのケースでは、描画部分をglActiveTexture(gl.TEXTURE0)と呼ぶことができます。そのため、描画前の部分はそのように設定されていると見なすことができます。

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

+0

ありがとうございます。 "アクティブなテクスチャユニットのポリシーはどうでしょうか?" - 私はすでに述べた原則に従っていますが、 "他のテクスチャユニットの使用に最も影響を与えないテクスチャをどのように初期化すればよいですか?" –

+0

あなたは私が話していることの別の例としてそれを読むことができます。 GLには、そのような「踏み外し」できる状態がたくさんあります。その作業には別のテクスチャユニットを使うことができます。つまり、何もリセットする必要はありませんが、 'glActiveTextureUnit()'を2回呼び出さなければなりません。または、現在のテクスチャユニットを壊して、テクスチャ状態を描画パートに設定する責任を渡すこともできます。いずれにしても、あなたのプログラムの一部には余分な作業があります。 –

+0

一方的に行ったり、効率と保守性の間で*小さな*トレードオフになります。 –

関連する問題