1

まず、プログラムに両方のシェーダーをアタッチしてから、呼び出しglGetUniformBlockIndexて均一なバッファーをバインドします。ユニフォームを見つけるために解析するシェーダーを関数で指定できると期待しglBindShaderていますが、そのようなことはありません。どのシェーダーを調べる必要があるかを OpenGL に伝えるにはどうすればよいですか?

4

1 に答える 1

4

プログラムが完全にリンクされていれば問題ありません。可能性glGetUniformBlockIndexとその結果は次のとおりです。

  • 指定された統一ブロック名は、どのシェーダにもありません。その後、戻ってきGL_INVALID_INDEXます。
  • 指定された統一ブロック名は、シェーダーの 1 つで使用されます。次に、 で使用するブロック インデックスを取得しますglUniformBlockBinding
  • 指定された統一ブロック名は、複数のシェーダーで使用されます。次に、それらすべてを意味するブロック インデックスを取得し、 で使用しglUniformBlockBindingます。

最後の部分が重要です。2 つのシェーダーで同じ名前のユニフォーム ブロックを指定する場合、GLSL ではそれらのユニフォーム ブロックの定義が同じである必要があります。そうでない場合は、 でエラーが発生しglLinkProgramます。それらは同じであるため (そうでなければ、ここに到達することはありません)、GLSL はそれらを同じ均一なブロックと見なします。

2 つのシェーダー ステージにある場合でも、同じ均一なブロックです。そのため、ステージ間で均一なブロックを共有でき、すべて 1 つのブロック バインドで済みます。それが本当に同じ均一なブロックである限り。

于 2012-04-04T23:53:41.130 に答える