2つのオーバーラップする同一平面サーフェスをレンダリングする場合、一般的な問題は「zファイティング」です。レンダラーは2つのサーフェスのどちらがカメラに近いかを判断できず、オーバーラップ領域に視覚的なアーチファクトを与えます。
これに対する標準的な解決策は、モデルの設計時に表面にわずかなオフセットを与えることです。他の解決策はありますか?
2つのオーバーラップする同一平面サーフェスをレンダリングする場合、一般的な問題は「zファイティング」です。レンダラーは2つのサーフェスのどちらがカメラに近いかを判断できず、オーバーラップ領域に視覚的なアーチファクトを与えます。
これに対する標準的な解決策は、モデルの設計時に表面にわずかなオフセットを与えることです。他の解決策はありますか?
回答:
表面が完全に同一平面上にある場合、あなたの運命はFPUの神次第です。Zファイティングが発生する可能性が高くなります。三角形がある場合は、同一とあなたが正確にそれぞれに同じ数学を、あなたがしますどちらも同じZ値で終わります。しかし、繰り返しますが、これは数学演算が両方で同じ場合にのみ起こります。(一般に、FPU操作は可換ではないため)
考えられる解決策の1つは、Zバッファーをまったく使用しないことです。代わりに、Painter's Algorithmを使用できます。確かに、これにはペインターアルゴリズムのすべての問題が伴います。しかし、それはZファイティングを解決するでしょう。
スクリーンスペースデカール(SSD)の例では、一般的な解決策は、単純な薄い立方体であるオフセットを使用することです。参照用に、SSDに関するWarhammer 40kのプレゼンテーションを参照してください。またはBart Wronskiの投稿では、デカールに関する他のいくつかの問題に対処していますが、SSDに関する他のいくつかのプレゼンテーションへのリンクもあります。
過去にこれを解決した方法は次のとおりです。
これを機能させるには、オブジェクトを連続して描画する必要があることに注意してください。
レンダラーによっては、アルゴリズムのようなノイズを使用して、マルチサンプリング深度で極小オフセットを適用することで、サーフェスをより「ファジー」にすることができます。これにより、深度が近接しているサーフェスに対して一種のブレンド効果が得られるはずです。私が知っているのは、フラグメントシェーダーでサンプルごとの深さを設定することは、OpenGLではごく最近であり、拡張機能としてのみです。
OpenGLにはPolygonOffsetがありますが、同一平面上にあるものをレンダリングしようとしていることを事前に知る必要があります。単一のモデル内のサーフェスには適していませんが、たとえば、一部の土地にオーバーレイされた道路をレンダリングする場合、うまく機能します。