2012-03-13 6 views
6

glUseProgram()はどのくらい速いのですか?よりよいものはあります(速い)?:ここglUseProgram()と速度の後のユニフォームの振る舞い

が私の考えです:

  1. 使用1つのユニバーサルシェーダプログラムが、より
  2. 使用以上(各グラフィックスクラスの設定)多くの入力設定や属性を持ちます各グラフィックスクラスの1シェーダ

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

は、私は#1の利点があることを考えるものです:

  • glUseProgram()

と#2の利点を使用しない:

  • ありません行列の変更(例えば、クラスMenuおよびクラスScene3Dが異なる投影行列を有する場合)

答えて

6

どのような2つのオプションは、シェーダの動作、設定の違い、設定するアトリビュート/ユニフォームの数、頻繁に変更する頻度によって大きく異なります。すべての場合に正解はありません。

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

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

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

+0

"2つのオプションは、シェーダの機能に大きく左右されます。" - タスクはシンプルです。テクスチャリングで、エフェクトなしでレンダリングします。 –

+0

非常にシンプルで効果があるものがあれば、テクスチャリング(openg gl 2.x以上を前提とする)とエフェクトクラスごとのシンプルなシェーダがあります。しかし、実際にはそれ以上のことを知らずに判断するのは難しいです。それはおそらく大きな画像では大したことではないでしょう。パフォーマンスの問題があり、それが状態変化のためであることを知っていない限り、もっと便利なことをしてください。 – haffax

+1

Uniform Buffer Objectを使用してプログラム間でユニフォームを共有することができます(例:[Shared Uniforms](http://arcsynthesis.org/gltut/Positioning/Tut07%20Shared%20Uniforms.html)を参照)。 – stativ