1

メイン シーンがあり、その上にレンダリングしたいシーンがあります。パフォーマンスのために初期の深度テストを使用したいので、すべてをまとめて前から後ろにレンダリングしたいと考えています。しかし、精度が制限されるため、各シーンを深度バッファーの半分に分離することはできません。バック シーンをレンダリングし、深度バッファーをクリアして、フロント シーンをレンダリングすると、正しく描画されますが、不要なオーバードローが発生します。余分なフレーム バッファとブリットも同様にオーバードローを引き起こします。

理想的な解決策 (以下で回答) は、glDepthRange を使用して深度バッファー内に複数のゾーンを確立し、通常のレンダリングを 2 パスの前後の順序で実行して、オーバードローを最小限に抑えながらクロスレイヤー オクルージョンを防止することです。

4

1 に答える 1

1

メインシーンがあり、その上にレンダリングしたいシーンがあります。パフォーマンスのために初期の深度テストを使用したいので、すべてを前から後ろに一緒にレンダリングしたいと思います。ただし、各シーンをデプスバッファの半分に分離することはできません。これは、その精度が制限されるためです。

通常、24ビットのデプスバッファ精度があります。これを半分に分割すると、23ビットの精度が得られます。どういうわけか、それが大きな問題になるのではないかと思います。もしそうなら、フロントオーバーレイに与えるスペースを少なくすることで、いつでもそれを取り戻すことができます。たとえば、深度範囲の5%だけです。

これは、FPSゲームが「ビューモデル」(プレーヤーの手と銃)オーバーレイを実行する方法です。プロがすることをしなさい。

どういうわけか、オーバーレイシーンをレンダリングし、深度バッファーの値を1ではなく-1に変更してから、メインシーンをレンダリングできますか?

-1は有効なデプスバッファ値ではありません。だから私はあなたが代わりに0と言ったふりをします。

はい、できます。シーンをデプステクスチャにレンダリングできます。次に、テクスチャから深度値を取得し、それを1と比較するフルスクリーンのクワッドをレンダリングします。正確に1.0でない場合は、1.0ではなく0を書き込みます。

しかし、この演習の要点はパフォーマンスですよね?私が今言ったことを機能させるために何が起こらなければならないかを考えてください。

GPUは、最初のシーンのレンダリングが完了するまで、そのフルスクリーンクワッドをレンダリングできません。つまり、レンダリングパイプライン全体を完全にフラッシュする必要があり、貴重な時間を無駄にします。

ソリューションと比較するとglDepthRange、これはおそらく遅くなります。

于 2012-11-09T23:55:16.910 に答える