1

OpenGL を使用して実際のモーション ブラーを実装しようとしていますが、累積バッファがありません (グラフィック カードで動作しないため)。実装に関する私のアイデアは次のとおりです。

  • 「ぼかし」ごとに(一時的に)空のフレームバッファとテクスチャの固定配列を用意する
  • 新しいフレームに遭遇するたびに、最初の要素を最後に移動し、代わりにそのフレームバッファにレンダリングします
  • 最初のフレームの不透明度は 1/ n、2 番目のフレームの不透明度は 1/( n / 2) というように、最新のフレームが 1 になるまですべてをレンダリングします。

これよりも簡単/高速/最適化された方法はありますか? それともこれが最善の解決策ですか?

4

2 に答える 2

3

NicolBolas がコメントで述べていることは正しいです。実際のモーション ブラーを取得するには、各フラグメントの速度によって制御されるベクトル ブラーを適用する必要があります。各頂点の画面空間速度を計算し、それを別のユニフォームとしてフラグメント シェーダーに渡します。次に、フラグメントの速度の方向と距離にベクトル ブラーを適用します。

これは他のフラグメントでぼやけるため、透明度の順序付けの問題が発生します。したがって、これをポスト プロセス エフェクトとして適用する必要があります。理想的には、深度ピール レイヤーを使用します。以前にレンダリングされたフレームのバックログを使用してブレンドすることで、深さの並べ替えの複雑さを節約できます。これは、基本的に、ベクトルブラーを追加した、提案したフレームバッファメソッドです。

于 2013-05-08T10:22:13.887 に答える
0

この種のことを行うには、次の 2 つの一般的な方法があります。

  1. 最終フレームのすべての「サブフレーム」を個別にレンダリングし、最終パスでそれらすべてを結合します
  2. 各パスで前のパスの結果を読み取り、それに重み係数を掛けると、サブフレームごとにサブフレームをレンダリングします。その結果、最終的なパスはそれらすべての構成になります。

これらの方法のどれがうまく機能するかを判断するのは簡単ではありません。方法 (2) には、多くのパスを作成するという欠点があるため、多くのオーバーヘッドが発生します。(1)の方法は、テクスチャの読み込みでボトルネックになります。方法 (1) でも、最終的には方法 (2) で行ったすべてのデータを読み取ることができますが、方法 (1) では、テクスチャ メモリのフェッチに複数のキャッシュ ラインを利用できます。したがって、ここでのパフォーマンスを決定する 2 つの最も重要な要素は次のとおりです。

a) 持っている「サブフレーム」の数 b) 画面の大きさと、読み書きするテクスチャの大きさ。

于 2013-05-08T10:14:02.960 に答える