9

glUseProgram() の速度は? より良い (より速い) ものはありますか?:

ここに私の考えがあります:

  1. 1 つのユニバーサル シェーダー プログラムを使用しますが、多くの入力設定と属性 (グラフィックス クラスごとの設定) を使用します。
  2. グラフィックス クラスごとに複数のシェーダーを使用する

シェーダープログラムを変更した後のユニフォームはどのような状態ですか? 値を保存しますか (たとえば、行列の値)?

#1の利点は次のとおりです。

  • glUseProgram() を使用しない

そして#2の利点:

  • 行列の変更なし (たとえば、クラスMenuとクラスScene3Dの射影行列が異なる場合)
4

1 に答える 1

10

2 つのオプションのどちらが優れているかは、シェーダーの機能、シェーダーの違い、設定するアトリビュート/ユニフォームの数、およびそれらが変更される頻度に大きく依存します。すべての場合に唯一の正解はありません。

つまり、状態変更のコストだけでなく、シェーダーのランタイム コストもあり、頂点ごとおよびフラグメントごとに支払われることに注意してください。したがって、シェーダーの複雑さを低く保つことは常に良い考えであり、ユニバーサル シェーダーは特殊なシェーダーよりも複雑です。

状態変化を最小限に抑えます。プログラム X を使用するオブジェクト A、C、E と、プログラム Y を使用するオブジェクト B、D、F がある場合、他のすべてが等しい場合、ABCDEF ではなく、ACEBDF の順序でレンダリングします。

最後の質問について: プログラムは、再リンクしない限り、その状態を保持し、したがってユニフォームの値を保持します。ただし、ユニフォームはプログラムの状態ごとです。つまり、異なるプログラムに同じ名前とタイプの 2 つのユニフォームがある場合、値はあるプログラムから別のプログラムに引き継がれません。

于 2012-03-13T13:06:33.213 に答える