16

長い間、OpenGL FrameBuffer Objects (FBO) を処理する最良の方法は何だろうと思っていました。FBO の切り替えはコストがかかる可能性がありますが、新しいアタッチメントも定義します。

どうすれば速くできますか?

私はこれらの3つの間で躊躇します:

  • すべてに 1 つの FBO、アタッチメントを変更しますが、FBO を切り替えないでください

  • レンダリング パス内のレンダー ターゲット (サイズ + フォーマット) ごとに 1 つの FBO。つまり、同様のレンダー ターゲットに対して同じ FBO を再利用します。しかし、この方法では、カスタム ブラーには 4 つ以上の FBO がかかります。

  • レンダー ターゲットごとに 1 つの FBO。添付ファイルを 1 回だけ設定してから、FBO を切り替える

また、FBO スイッチの数を最小限に抑える必要がありますか (テクスチャ バインディングの数を最小限に抑えるように) ?

4

2 に答える 2

14

更新された参照:


NVIDIA 2005 (おそらく時代遅れ): 私が知っている NVIDIA による最後の公式パフォーマンス推奨は、ほぼ 5 年前のものです。GDC プレゼンテーションで、Simon Green は次のことを推奨しています (スライド 29)。

パフォーマンスが向上する順序で:

  1. 複数の FBO
    • レンダリングするテクスチャごとに個別の FBO を作成します。
    • を使用して切り替えるBindFramebuffer()
    • wglMakeCurrent()ベータ版の NVIDIA ドライバーよりも 2 倍高速になる可能性があります
  2. 単一の FBO、複数のテクスチャ アタッチメント
    • テクスチャは同じフォーマットと寸法を持つ必要があります
    • FramebufferTexture()テクスチャの切り替えに使用
  3. 単一の FBO、複数のテクスチャ アタッチメント
    • 異なる色の添付ファイルにテクスチャを添付する
    • glDrawBuffer()レンダリングを異なる色のアタッチメントに切り替えるために使用します

私の経験では、2 番目のケースは最初のケース (ATI Radeon HD4850、Geforce 8800GT) よりも非常に高速です。コードが複雑になるため、3 番目のケースは試していません。

于 2010-02-04T23:10:28.443 に答える
4

哲学の問題として、オブジェクトの状態を変更するには、再検証する必要があります。代わりに、オブジェクト バインディング (前のフレームから既に有効) を変更するだけで、ドライバーの速度が向上するはずです [1]。

したがって、最初の実装として、レンダー ターゲットごとに 1 つの FBO を使用します (より正確には、レンダー ターゲットセットです。通常は一度に複数のバッファーにレンダリングします)。

とはいえ、複数の実装に対するアプリのベンチマークに勝るものはありません。

[1] アーキテクチャによっては、FBO の変更によって GPU フラッシュが強制的に実行される可能性があるため、ドライバーについて言及します。ほとんどの場合、気泡が入ります。したがって、頻繁にやりたくないことは間違いありません。テクスチャ バインディングを最適化するよりも重要です。

于 2010-02-04T12:09:14.843 に答える