シェーダープログラムを変更するときに、ユニフォームまたは属性を再バインドする必要がありますか?


11

シーンのレンダリングには通常、複数のシェーダープログラムが含まれます。私の場合、すべてが同じ属性を使用し、少なくともいくつかのユニフォームを共有しています。それらを適切に機能させるために、私は現在安全にプレイしています。つまり、シェーダープログラムを切り替えるたびに属性を再バインドし、適切な均一の場所を取得しています。したがって、基本的に各フレームで複数回実行することは、おそらく最善の方法ではありません。

では、シェーダープログラムを切り替えた後、(一般的に)属性とユニフォームを再バインドする必要がありますか?なぜ?

もしそうなら、これをプログラムの開始時に一度行い、再びそれらに触れる必要がない方法はありますか?

回答:


12

両方のシェーダーで属性の位置が同じであることを確認する限り、属性を再バインドする必要はありません。(通常layout(location = X)、GLSL の構文を使用しますが、glBindAttribLocation前者が使用できない場合でも使用できます。)

ただし、ユニフォームはシェーダーオブジェクトの状態の一部であるため、シェーダーごとに少なくとも1回は設定する必要があります。これのコストを最小限に抑える1つの方法は、すべての均一な値を含み、1回の呼び出しでシェーダーにバインドできるUniform Buffer Objectを使用することです。


UBOリンク上:「最後に、それらは異なるプログラム間で情報を共有するために使用できます。したがって、単一のバッファーを変更すると、複数のプログラムのユニフォームを効果的に更新できます。」
Zouch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.