ユニフォームがどのように記憶に表現されているのかわかりません。
ユニフォームは貴重なレジスタスペースを占有する可能性があるように見えますが、最終的にはグローバルメモリに渡されます。
ユニフォームを使わないと状況は変わりますか?コンパイラはそれらを最適化できますか?-この場合、バインディングの場所として無効(-1)を取得したので、「はい」と想定します。
ユニフォームがどのように記憶に表現されているのかわかりません。
ユニフォームは貴重なレジスタスペースを占有する可能性があるように見えますが、最終的にはグローバルメモリに渡されます。
ユニフォームを使わないと状況は変わりますか?コンパイラはそれらを最適化できますか?-この場合、バインディングの場所として無効(-1)を取得したので、「はい」と想定します。
ユニフォームは、GLSLコンパイラとOpenGL実装が適切と見なす方法で表されます。一部の実装では、特定のユニフォームをアセンブリ内の実際の定数にするため、ユニフォームを変更すると、実際にその場でアセンブリにパッチが適用されます。ユニフォームのための特別な記憶を持っている人もいます。
それはすべてハードウェアに依存します。
コンパイラーはユニフォームを最適化することができます。これが「アクティブユニフォーム」という用語の由来です。ユニフォーム情報をクエリするためのOpenGLAPIは、アクティブなユニフォーム、つまりコンパイラによって使用中であることが実際に検出されたユニフォームに対してのみ機能します。
まず第一に、GLSL仕様はその概念の実際の実装について何も述べていないので、以下の詳細はもちろん「どのような方法でもかまいませんが、今日では通常その方法です」と読む必要があります。
グラフィックハードウェアに関する私の(おそらく限られた)知識に関しては、ユニフォームは通常、グローバルデバイスメモリの一部であるいわゆるコンスタントメモリに存在します(新しいハードウェアではキャッシュする必要があります)。これは、シェーダーで変更できないためです。とにかくプログラムであり、プログラムのすべての呼び出しに対してグローバルです(これは、異なるマルチプロセッサで並行して実行でき、実行する必要があります)。したがって、マルチプロセッサごとのレジスタスペース自体を占有することはありません。
もちろん、GLSLコンパイラーが未使用のユニフォーム(および属性)を最適化できる(そして通常はそうする)という点でも正しいですが、もちろん、それらが実行の可能なブランチで使用されていない場合に限ります。したがって、の均一な位置を取得することで経験したこと-1
は、完全に有効な(そして通常は望ましい)動作です。