2

そんな状況を考えてみましょう。シーンには指定されたオブジェクトが含まれています: ABCDE

カメラからの順序 (最も近いものから最も遠いものへ) AEBDC

オブジェクト AC は、shader1、ED シェーダー 2、B シェーダー3 を使用します

オブジェクト AC はシェーダーを使用しますが、テクスチャは異なります。

では、このような状況に対処するにはどうすればよいでしょうか。

  • すべてを前から後ろにレンダリングします (5 回のスワップ)
  • ソートされたシェーダー グループごとにレンダリングします (3 つのシェーダー スワップ)。
  • すべてのシェーダー プログラムを 1 つにマージします (1 スワップ)。

glUniformなどの命令glBindTextureで、既に使用中のプログラムの値を変更すると、オーバーヘッドが発生しますか?

4

2 に答える 2

4

この質問に対する答えは 1 つではありません。OpenGLの状態を変更すると「オーバーヘッドが発生」しますか? もちろんそうです。何も無料ではありません。問題は、状態の変化によって引き起こされるオーバーヘッドが、効果の低い深度テストのサポートよりも悪くなるかどうかです。

答えは、オーバードローの量、フラグメント シェーダーのコスト、特定の一連のドロー コールに必要な状態変更の数、および事前に知ることができないその他の多くの無形資産に依存するため、答えることはできません。

そのため、最適化のプロファイリングが重要です。

于 2013-07-24T17:12:06.333 に答える
1

プロフィール、プロフィール、さらにプロフィール :)

ただし、1つ追加したいと思います。

あなたの状況では、レンダリングキューのアイデアを使用できます。これは、オブジェクトを描画するためのある種のマネージャーです。オブジェクトを描画する代わりに、renderQueue.add(myObject). 次に、add()必要なすべてのオブジェクトを呼び出すことができますrenderQueue.renderAll()。このメソッドはすべての並べ替え (距離、シェーダー、マテリアルなど) を処理できるため、プロファイリング (およびレンダリング方法の変更) の際により便利になります。

もちろん、これは大まかな考えにすぎません。

于 2013-07-25T12:48:20.620 に答える