10

短い:

すべてのシェーダーが使用できる関数を定義できますか? それとも、シェーダーごとに定義する必要がありますか?


一部始終:

したがって、ランプはシェーダーごとに 1 回定義する必要があり、関数はすべてのシェーダーが安全に使用できるように一度に定義する必要があります。

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

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

4

1 に答える 1

16

これは C と同様に行うことができます。ヘッダーで関数を宣言し、共通の C ファイルで定義します。

GLSL では、次のことを行う必要があります。

  1. 一部のシェーダー (文字列) で、関数を定義します (それを COMMON と呼びましょう):

    float getCommonValue() { return 42; }
    
  2. この関数を使用するすべてのシェーダーで、宣言して使用するだけです (SHADER1 と呼びましょう)。

    float getCommonValue();
    void main() { gl_Color = vec4(getCommonValue(), 0, 0, 0); }
    
  3. シェーダーをglCompileShaderコンパイルするときに、COMMON シェーダーを 1 回だけコンパイルし、シェーダー Gluint をどこかに保存します。

  4. glLinkProgramプログラムを SHADER1 にリンクすると、glAttachShader両方のシェーダー (COMMON と SHADER1) を使用してプログラムにアタッチされます。getCommonValueしたがって、あるシェーダーから別のシェーダーに関数を呼び出すことができます。

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

于 2012-05-05T19:57:02.563 に答える