深度テストを使用していなくても、ピクセルを破棄するパフォーマンスを失いますか?


22

破棄命令を最初に検索したとき、破棄を使用するとパフォーマンスが低下するという専門家がいます。ピクセルを破棄すると、zBufferを適切に使用するGPUの機能が破損するため、GPUは両方のオブジェクトに対してフラグメントシェーダーを最初に実行して、カメラに近いものが破棄されるかどうかを確認する必要があると述べました。現在作業中の2Dゲームの場合、depth-testとdepth-writeの両方を無効にしました。私はすべてのオブジェクトをその深さでソートして描画していますが、それはすべてです。GPUが派手なことをする必要はありません。今、フラグメントシェーダーでピクセルを破棄するのはまだ悪いのではないかと思っています。

回答:


20

グラフィックスハードウェアは、色の値を計算する前に(つまり、フラグメントシェーダーを実行する前に)フラグメントの初期の深度ベースのカリングを実行できます。そのため、discardアルファテスト、gl_FragDepthハードウェアの機能の操作など、それに影響する機能を利用すると、フラグメントの真の深さを推測できず、完全なシェーダーを実行する必要があるため、最適化が損なわれます。

ただし、これらの妥協的な機能のいずれかを使用すると、パフォーマンスに実質的な影響があるかどうかは、状況によって異なります。たとえば、非常に高価なフラグメントシェーダーがある場合、早期z最適化はパフォーマンスを向上させることができますが、パイプラインのコストが頂点シェーダー(または他の場所)にある場合、それほどメリットはありません。またはを使用してパフォーマンスが低下しないdiscard

APIを使用して深度テストを完全に無効にすると、シーンが誤ってレンダリングされる可能性があるため、最適化も実行できなくなります。その場合、を使用することは問題ではありませんdiscard

最近のハードウェアでは、テスト(初期のステンシルテストを含む)を使用して強制することができlayout(early_fragment_tests)ます。これについては、回答の冒頭でリンクしたページに詳細情報(および警告)があります。


3

パフォーマンスに関する質問の場合、常に最も正確な答えは、ターゲットハードウェアで試して、何が起こるかを測定することです。

あなたの場合、それはおそらく悪いことではありません。実際、メモリ帯域幅を節約することでパフォーマンスを向上させる可能性があります。ただし、シェーダー命令も追加されるため、必ずしもパフォーマンスが向上するとは限りません。

デプスバッファーを使用している場合でも、描画する順序に注意を払うと、パフォーマンスヒットは必ずしもそれほど重要ではありません。

https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/にブログ記事があり、初期の深さテストがどのように機能するかについて詳しく説明しています。ハードウェアで、どのような制限があるかもしれません。


1
実際にテストを行った後、パフォーマンスを失ったり獲得したりしないと仮定しても安全だと思いますが、何がなぜ起こるのかを詳細に説明する答えを探していました。
Ali1S232
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.