GLSLには、gl_lightsourceなどの複数のグローバル変数があらかじめ定義されています。 シェーダがアクセスできるため、グローバルです。GLSLグローバル変数
GLSLでカスタムグローバル変数を定義するにはどうすればよいですか?
GLSLには、gl_lightsourceなどの複数のグローバル変数があらかじめ定義されています。 シェーダがアクセスできるため、グローバルです。GLSLグローバル変数
GLSLでカスタムグローバル変数を定義するにはどうすればよいですか?
グローバル変数はGLSLには存在しません。 gl_*
変数は、シェーダからのパイプラインのプログラマブルでない要素にアクセスするために、ハードコードされた変数です(は、自動的にコンパイル時に追加されたものとみなします。)。 Core OpenGL 3.0では、gl_LightSource
を含むそれらのほとんどが削除されました。ユーザーは今では自分の行列とライトを処理し、それらをシェイダーにユニフォームとして送ることが期待されています。あなたが残っているすべてのもののリストを見たい場合は、GLSL Reference Pagesを見てください。
ユニフォームは何ですか?シェイダー間でユニフォームを同期させたい場合は、すべてのプログラムでユニフォームとイテレーションの位置を保存して、各シェーダーにユニフォームをアップロードします。
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;
均一バッファを使用できます。ここにチュートリアルがあります:http://www.lighthouse3d.com/tutorials/glsl-tutorial/uniform-blocks/
しかし、program2がfooにアクセスしたい場合はどうなりますか? –
@KevinKostlan:複数のプログラムで同じユニフォームを使用することを止めるものはありません。上記の手順に従ってください。 –
私はglUniformXを1回実行してから、すべてのシェーダがそれを持つことができる(時間を節約できる)カメラマトリックスを持つことを望んでいました。私は存在しないと思う。 –