2009-07-21 19 views
0

シェーダでOpenGL glTexEnvの動作を模倣しようとしています。それはかなり複雑な機能ですが、実行可能でなければなりません。唯一の問題は、テクスチャベースの内部形式によって機能が異なることです。どのようにしてその情報をテクスチャから得ることができますか?テクスチャベースの内部フォーマットはglTexImage2D関数で与えられていますので、そこにいくつかの変数を保存して、バインドされたテクスチャに応じていくつかのユニフォームでシェーダに渡す必要がありますか、どういうわけかOpenGLで取得できますか?シェーダへのOpenGLテクスチャベース内部フォーマット

+0

内部フォーマットはどのようにシェーダに影響しますか? – Luca

+0

@ルーカ例えば1つのチャンネルしか持たないテクスチャがあるかもしれません(32ビットでエンコードされた赤の値を言いましょう)。シェーダーが少なくとも2つのチャンネル(赤と緑など)を予期している場合、1チャンネルのテクスチャを提供する際に問題が発生する可能性があります。 – wil

答えて

0

テクスチャのブレンド値は、組み込みの制服の一部ではないようです。

  1. 一つの大きなシェーダ、シェーダに値を渡す...
  2. 作成シェーダ、それぞれの行動や内部形式のため:

    http://www.opengl.org/sdk/libs/OpenSceneGraph/glsl_quickref.pdf

    は、一般的に模倣FFPの行動のための2つの方法があります例えば、必要に応じて動的に変更することができる。

私は2番目の方法が好きです。なぜなら、1つの大きくて遅いallroundシェーダにならないからです。 その代わりに、小さな特定のシェーダが得られます。

さらに、この一般的な問題は「組み合わせシェーダー爆発」問題として知られています。

+0

実際には、1つのシェーダで何かを実装することはできません。テクスチャユニット0のTEXTURE_3DとTEXTURE_2Dターゲットが有効になっているとします。固定関数仕様では、3Dテクスチャがサンプリングされるとしています。プログラム可能なパイプラインは、どのサンプラーが使用されているかに基づいてサンプリングされるものをシェーダーが決定すると言います。つまり、テクスチャターゲットの組み合わせごとに特定のシェーダを構築する必要があります。 1D/2D/3D /立方体、8つのテクスチャユニットでは、すでに64Kのシェーダの可能性を与えています... – Bahbar

0

いいえ、テクスチャベース内部フォーマットはシェーダで直接利用できません。自分で保存したくない場合は、常にGLにその値を渡してシェーダに渡すように依頼することができます。

glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &outFormat)` 
関連する問題