2012-05-05 18 views
5

ショート:GLSL再利用可能/共有関数、共有定数(OpenGL ES 2.0)?

すべてのシェーダーが使用できる機能を定義できますか? シェーダごとに定義する必要がありますか?


全体的な話:

  • 私は事前に定義されたグラデーションランプ(このような何か - http://www.thinkboxsoftware.com/storage/krakatoa-support-images/krakatoa15_kcm_densitybyage_gradientrampmap.png)と入力フラグメントを色付けすることを意図し、多くのシェーダを作成したいです。

  • Iは

  • (アルファ値が勾配の位置を保持vec4色サンプルのアレイが、上記画像に順位を参照)、各シェーダする傾斜ランプ定数を定義したいと私は必要関数は、特定のテクスチャ座標位置に対して与えられた勾配ランプからカラーサンプルを返すことができます。

ので、ランプがはONCEシェーダごとに定義する必要があり、機能はすべてのシェーダが安全に使用できるすべてを一度に定義さでなければなりません。

私はアルゴリズムを持っていますが、問題はの共有関数であり、GLSLで定数を定義しています。

これは可能ですか? または、すべてのシェーダーに関数をコピーする必要がありますか?いくつかのプリコンパイルオプションはありますか?

答えて

9

C言語と同様にすることができます。ヘッダに関数を宣言し、それを共通のCファイルで定義します。あなたが次のことを行う必要がありますGLSLで

いくつかのシェーダ(文字列)で
  1. あなたは関数を定義する(COMMONそれを呼び出すことができます):あなたが望むすべてのシェーダで

    float getCommonValue() { return 42; } 
    
  2. この関数を使用するには、宣言して使用するだけです(SHADER1と呼ぶことができます)。

    float getCommonValue(); 
    void main() { gl_Color = vec4(getCommonValue(), 0, 0, 0); } 
    
  3. あなたはどこか

  4. あなたがSHADER1ためglLinkProgramでプログラムをリンクするときにglAttachShader両方シェーダでプログラムする添付回のみCOMMONシェーダをコンパイルし、店舗シェーダGLuint glCompileShaderでシェーダーをコンパイル - COMMONとSHADER1。したがって、getCommonValue関数を1つのシェーダから他のシェーダに呼び出すことができます。

  5. 異なるソーダプログラム(SHADER1、SHADER2、...)に対してCOMMONシェーダGLuint値を複数回再利用することができます。

+0

おはよう、私はそれを試してみましょう。 – Geri