多くの一般的なAAAタイトル(特にソースエンジンゲーム)では、境界外やマップの下の傾斜など、プレーヤーが「未分類」の領域に到達したとき。画面に奇妙な効果が発生します(バッファのティアリング?)。
これは、Windows XPがシステムがハングしている間にドラッグされたウィンドウを後に残す可能性があるウィンドウの軌跡に似ていると説明できます。
画面を更新するときに開発者がカラーバッファをクリアしないと仮定することしかできませんか?
あれは正しいですか?もしそうなら、なぜですか?
多くの一般的なAAAタイトル(特にソースエンジンゲーム)では、境界外やマップの下の傾斜など、プレーヤーが「未分類」の領域に到達したとき。画面に奇妙な効果が発生します(バッファのティアリング?)。
これは、Windows XPがシステムがハングしている間にドラッグされたウィンドウを後に残す可能性があるウィンドウの軌跡に似ていると説明できます。
画面を更新するときに開発者がカラーバッファをクリアしないと仮定することしかできませんか?
あれは正しいですか?もしそうなら、なぜですか?
回答:
むかしむかし、色バッファと深度バッファのクリアには実際に時間がかかりました。クリアを行うということは、グラフィックスカードがフレームバッファーのすべてのピクセルを調べて値を書き込む必要があることを意味します。
このため、ゲーム開発者は、すべてのピクセルが再びレンダリングされると単純に仮定する方が効率的であることを発見しました。彼らはこれを行うための多くのテクニックを開発しました。
カラーバッファは最も簡単に無視できます。深度バッファは古いデータで汚染されるため、それほど簡単ではありません。彼らがしたことは簡単でした。
フレーム0では、glDepthRange
(0、0.5)の(またはD3Dに相当する)でレンダリングされ、glDepthFunc
of GL_LESS
(またはGL_LEQUAL
)をます。これは、深度バッファで取得する最も深い深度値が0.5であることを意味します。したがって、フレーム0の最後の深度バッファの最大値は0.5です(すべてのピクセルに書き込んだと仮定)。
フレーム1では、深度範囲を(1、0.5)に変更します。この場合、近深度の値は遠深度よりも大きいことに注意してください。しかし、それらは深さ関数をGL_GREATER
(またはGL_GEQUAL
)に変更し、深さテストの意味を逆にします。深度バッファの最大値は0.5であるため、書き込むすべての値はこれより大きくなります。深度テストが逆になったため、これは事実上、フレーム0に書き込まれたものがフレーム1に書き込まれる可能性のあるものよりも遠くなることを意味します。フレーム1の終わりで、深度バッファの最小値は0.5になりました。
そして、彼らは繰り返します。
2003年頃以降に作成されたハードウェアでは、これはもはや最適化ではありません。実際、これは負の最適化です。深度バッファをクリアすると、実際にはハードウェアが高速になります。いいえ、本当に。
基本的には、バッファをクリアしても実際には何も書き込まれないということが起こります。それらは、GPUのキャッシュにいくつかのビットを保存し、システムにクリアされた色/深さをシステムに知らせます。システムがフレームバッファのキャッシュラインに書き込もうとするとき、クリアな色/深さ値の空白フィールドであることをすでに知っているので、そこにあるものを読むことを気にしません。そこにあるものとブレンドしようとする場合、または深さテストを行う場合、もう一度読む必要はありません。どの値をブレンド/テスト/対抗するかを知っています。
したがって、クリア後に各キャッシュラインで行う最初の読み取り/変更/書き込みはすべて基本的に書き込みです。それはです無料。
さらに、ギザギザの深さのバッファを使用すると、ハードウェアでのHyper-Z / Hierarchial-Z / Z-culling最適化に対して機能します。はい。詳細を追加すると、最終的にシーンはそれらに対して機能します。ただし、深度バッファが以前のレンダリングからギザギザになっている場合、たとえそれらの背景オブジェクトが背景にあるとしても、Zカリング技術の効率に影響を与える可能性があります。そして、それはパフォーマンスの向上にはつながりません。
したがって、現代のゲームではこの深度反転手法を絶対に行わないでください。
注:Jariは、タイルベースのレンダリングアーキテクチャ(ほとんどのモバイルプラットフォームで見られる)で良い点を示しています。深さをクリアしないと、物事が不快になります。
はい、バックバッファーがクリアされていないことは正しいです。
理由は、(主に)各フレームの反対方向に深度値をピンポンするカスタムシェーダーを使用し、ゲームが常に画面上のすべてのピクセルをレンダリングするという事実に依存しているためです。
したがって、コストをゼロにするには、フレームごとに1つのバッファークリアを保存します。