2012-01-01 31 views
3

GLSLには、gl_lightsourceなどの複数のグローバル変数があらかじめ定義されています。 シェーダがアクセスできるため、グローバルです。GLSLグローバル変数

GLSLでカスタムグローバル変数を定義するにはどうすればよいですか?

答えて

4

グローバル変数はGLSLには存在しません。 gl_*変数は、シェーダからのパイプラインのプログラマブルでない要素にアクセスするために、ハードコードされた変数です(は、自動的にコンパイル時に追加されたものとみなします。)。 Core OpenGL 3.0では、gl_LightSourceを含むそれらのほとんどが削除されました。ユーザーは今では自分の行列とライトを処理し、それらをシェイダーにユニフォームとして送ることが期待されています。あなたが残っているすべてのもののリストを見たい場合は、GLSL Reference Pagesを見てください。

ユニフォームは何ですか?シェイダー間でユニフォームを同期させたい場合は、すべてのプログラムでユニフォームとイテレーションの位置を保存して、各シェーダーにユニフォームをアップロードします。

1

OpenGLのグローバルシェーダー変数は、「制服」と呼ばれます。それらは読み取り専用で、glUniformXコールでバインドすることができます。おおまかに、それがこの(これは擬似コードの詳細です)のようになります。シェーダ内

// 1. activate the program 
glUseProgram(program) 

// 2. get uniform location 
foo = glGetUniformLocation(program, "foo") 

// 3. bind the value, e.g. a single float 
glUniform1f(foo, 42.0) 

、あなたは、例えば、uniformストレージ修飾子で変数を修飾する必要があります

uniform float foo; 
+0

しかし、program2がfooにアクセスしたい場合はどうなりますか? –

+0

@KevinKostlan:複数のプログラムで同じユニフォームを使用することを止めるものはありません。上記の手順に従ってください。 –

+0

私はglUniformXを1回実行してから、すべてのシェーダがそれを持つことができる(時間を節約できる)カメラマトリックスを持つことを望んでいました。私は存在しないと思う。 –