0

まず、
Windows XP SP3、2GB RAM、Intel Core 2 Duo 2.33 GHz、nVidia 9600GT 1GB RAM。OpenGL 3.3 が完全に更新されました。

私がやっていることの簡単な説明:
理想的には、フレームごとに glTexSubImage2D を使用して GL テクスチャ (A) に 1 つのピクセルを配置する必要があります。
次に、shader-FBO-quadfacingcamera セットアップ内のテクスチャを変更し、元の画像を結果の FBO に置き換えます。

もちろん、FBO フィードバック ループは必要ありません。代わりに、変更したバージョンを一時的なテクスチャ内に配置し、glCopyTexSubImage2D を使用して個別に更新を行います。

シーケンスは次のとおりです。

1) フレームごとに glTexSubImage2D を使用して GL テクスチャ (A) に 1 ピクセルを配置します (幅 = 高さ = 1)。
2) この変更されたバージョン A は、別のテクスチャ (B) にレンダリングされるシェーダー FBO クワッド セットアップ内で使用/変更されます。
3) 結果のテクスチャ B は、glCopyTexSubImage2D を使用して A の上に上書きされます。
4) 繰り返す...

このループを繰り返すことで、フレームごとにシェーダーのカラー値に 0.99 を掛けて、ゆっくりとしたフェード効果を実現したいと考えています。

2 つの点が大きく間違っています
。1) フレームごとに 0.99 のフェード係数が繰り返されると、フェードは RGB 48、48、48 で停止します。したがって、完全にフェードアウトしない灰色がかったピクセルの跡が残ります。
2) プログラムは 100 FPS で実行されます。ひどい。glCopyTexSubImage2D をコメントアウトすると、プログラムは 1000 FPS になるからです!!

glTexSubImage2D だけをコメントアウトし、glCopyTexSubImage2D をそのままにしておくことでも、1000 FPS を達成しています。この事実は、glTexSubImage2D と glCopyTexSubImage2D 自体がボトルネックではないことを明確にするためのものです (コピーを行うために glCopyTexSubImage2D をセカンダリ FBO に置き換えようとしましたが、同じ結果になりました)。

観察: ボトルネックは、これらのコマンドが両方とも機能していることを示しています!

ハードモード: PBO なし pls.

ソースと exe へのリンク:
http://www.mediafire.com/?ymu4v042a1aaha3
(CodeBlocks と SDL を使用)
FPS カウントは stdout.txt に書き込まれます

そこで公開されている 2 つの問題の回避策をお願いします。
期待される結果: 800 ~ 1000 FPS で完全なフェードアウト効果がプレーンな黒になります。

4

2 に答える 2

0

問題1へ:

ここで、精度 (および量子化) の問題が発生しています。8 ビットの UNORM フレームバッファ形式を使用していると想定しているため、それに書き込むものはすべて、256 レベルから次の個別のステップで丸められます。考えてみてください: 48*0.99 = 47.52、これは再び 48 になるため、それ以上暗くなることはありません。実際の浮動小数点形式を使用することは解決策ですが、全体的なパフォーマンスが大幅に低下する可能性があります...

選択したフェードアウト操作は、単に最良の選択ではありません。値を少なくとも 1/255 減少させることを保証するために、何らかの線形項を追加することをお勧めします。

問題 2 へ: ここでの実際のボトルネックが何であるかを言うのは難しいです。PBO を使用していないため、同期テクスチャ更新に限定されます。

しかし、なぜそのコピー操作を行う必要があるのでしょうか? この種のことに対する標準的なアプローチは、テクスチャ/FBO/カラー バッファの「ピンポン」であり、反復ごとにテクスチャの「役割」を交換するだけです。したがって、次のシーケンスが得られます。

  1. アップデートA
  2. B にレンダリング (A から読み取る)
  3. アップデートB
  4. A にレンダリング (B から読み取る)
于 2013-06-07T19:59:05.903 に答える
0

問題 2: 任意のピクセルをできるだけ早くテクスチャにスプラッティングする。
おそらく、メイン メモリから GPU にデータを動的にアップロードする絶対最速の方法は頂点配列または VBO にあるため、問題 2 の解決策は簡単です
。1) 頂点配列と色配列を作成します
(または、座標と色、パフォーマンス/帯域幅をインターリーブします)。異なる場合があります);
2) Z コンポーネント = 0。ポイントを床に配置したいと考えています。
3) 正投影で下向きのカメラ
(画面サイズと座標範囲が正確に一致していることを確認してください)。
4) glPointSize=1 および GL_POINT_SMOOTH を無効にした GL_POINTS を使用して、FBO でテクスチャにレンダリングします。

かなり標準的。これで、プログラムは 750 fps で実行されます。十分近い。私の夢はすべて、「お母さん見て! glTexSubImage2D を 1000 fps で実行しているのよ!」のようなものでした。そしてまあ。
glCopyTexSubImage2D は非常に高速ですが。お勧めします。

これがフェードを GPU アクセラレートする最良の方法であるかどうかはわかりませんが、結果を考えると、これには力が強く集中していることに注意する必要があります。いずれにせよ、フェージングが途中で止まる問題は、最小定数減少変数を設定することで修正されるため、指数曲線が失敗したとしても、フェージングは​​何があっても終了します。

于 2013-06-11T21:10:01.680 に答える