複雑な3Dシーンでアルファブレンディングを適切に実装するにはどうすればよいですか?


11

この質問の答えは少し簡単に聞こえるかもしれませんが、それは私を夢中にさせています。適切なアルファブレンディングメカニズムで処理できる状況が多すぎるため、アルゴリズムごとに欠けているものがあると考えることができます。

これらは私がこれまでに考えた方法です:

  • まず、オブジェクトの深さによる並べ替えについてですが、オブジェクトは単純な形状ではなく、曲線があり、互いにループする可能性があるため、これは単に失敗します。だから、どちらがカメラに近いのか常にわからない。

  • 次に、三角形の並べ替えについて考えましたが、これも失敗する可能性があります。実装方法がわからないので、2つの三角形が互いに通過するという問題が再び発生する可能性があるというまれなケースがあります。繰り返しますが、どちらがより近いかは誰にもわかりません。

  • 次に、深度バッファーを使用しました。少なくとも深度バッファーがある主な理由は、前述した並べ替えの問題が原因ですが、今度は別の問題が発生します。オブジェクトは透明なので、1つのピクセルに複数のオブジェクトが表示される場合があります。では、どのオブジェクトにピクセル深度を保存する必要がありますか?

  • 次に、最前面のオブジェクト深度のみを保存できると考え、そのピクセルを使用して、次の描画呼び出しをどのようにブレンドするかを決定しました。しかし、再び問題が発生しました。2つの半透明の平面の中央に固体平面があると考えてください。最後に固体平面をレンダリングしようとしていましたが、最も遠い平面を見ることができます。そのピクセルの色が1つだけになるまで、2つのプレーンごとにマージすることに注意してください。上で説明したのと同じ理由で、明らかにソート方法も使用できます。

  • 最後に、すべてのオブジェクトをさまざまなレンダーターゲットにレンダーし、それらのレイヤーを並べ替えて最終的な出力を表示することが、私が作業できると思います。しかし、今回はこのアルゴリズムをどのように実装できるかわかりません。

回答:


11

短い答え

見て奥行き剥離。私の研究によると、複数のレンダリングパスが必要なため計算コストが高くなりますが、これが最良の代替手段のようです。こちらもNVIDIAによる新しい、より高速な実装です。

ロングアンサー

それは難しい質問です。私が読んだほとんどの本は、主題について読み飛ばして、そのままにしておきます。

すべての不透明なオブジェクトをレンダリングすることから始めて、透明なオブジェクトを上から後ろへと順番にブレンドします。

重心でオブジェクトを並べ替える明らかなアプローチは正しい並べ替え順序を保証しないので、しかし言うよりも簡単です。

ペインタのアルゴリズムが一般的なケースでは機能せず、深度バッファが必要なのは、まったく同じ問題です。

そうは言っても、私が言及した本の1つにいくつかの解決策があります。

  • Depth Peeling-最も近いものだけでなく、n番目に近いフラグメントを提供することにより、深度バッファーの制限を克服するマルチパスソリューション。最大の利点は、透明なオブジェクトを任意の順序でレンダリングでき、並べ替えの必要がないことです。複数のパスがあるためにコストがかかる可能性がありますが、上部で指定したリンクはパフォーマンスを向上させるようです。

  • Stencil Routed K-Buffer-ステンシルルーティングを使用して、ジオメトリパスごとにピクセルごとにフラグメントの複数のレイヤーをキャプチャします。主な欠点は、フラグメントを後処理パスでソートする必要があることです。

また、問題のハードウェアソリューションについても触れていますが、実際には利用できないと思います。

  • F- Buffer-マルチパスレンダリング用のラスタライズ順FIFOバッファー。それにもかかわらず、良い読み物と紹介では、透過性のソート順の問題と現在の解決策についても少し触れています。

完璧な結果は得られないが、何もしないよりはましな他の回避策:

  • すべての不透明オブジェクトをレンダリングした後、透明オブジェクトのZバッファテストを引き続き使用しますが、Zバッファの書き込みを無効にします。不適切な並べ替えによってアーティファクトが発生する可能性がありますが、少なくともすべての透明なオブジェクトは表示されます。

上記のFバッファホワイトペーパーを引用します。

最も簡単な解決策は、部分的に透明な各ポリゴンを完全に独立してレンダリングすることです(つまり、次のポリゴンに進む前にすべてのパスをレンダリングします)。このソリューションは通常、状態変更のコストが発生するため、法外に高価です。または、アプリケーションまたはシェーディングライブラリでポリゴンをグループ化して、重複しないポリゴンのみが一緒にレンダリングされるようにすることができます。ほとんどの場合、このソリューションは、ポリゴンの画面空間分析を実行するソフトウェアを必要とするため、魅力的でもありません。


11

正解は#1です。すべてのものを深度でソートしてレンダリングします(明らかに、深度書き込みをオフにしますが、テストはオフにします)。「もの」とは?

各「もの」は凸オブジェクトでなければなりません。自己重複することはできません。したがって、凹状のオブジェクトがある場合は、凸状の部分に分割する必要があります。

これは透明なシーンをレンダリングする標準的な方法です。相互侵入事例を解決しますか?いいえ。深度の順序を決定できない3つのオブジェクトがある場合は解決しますか?いいえ。長いオブジェクトが中央の奥にある小さなオブジェクトと重なる場合を解決しますか?番号。

しかし、それは十分に機能します。ゲームは深度ピーリングを使用しません。ステンシルルーティングされたkバッファーは使用しません。Fバッファは使用しません。どうして?これらのことは信じられないほど遅いからです。

標準的な方法でアーティファクトが発生する場合があります。ただし、少なくともゲームはかなり高速に実行されます。

DX11以上のハードウェアに制限する場合は、適切な並べ替えを使用してブレンディングを実装する方法があります。速度は遅くなりますが、以前の手法ほど遅くはありません。また、アーチファクトを引き起こす可能性のある深度ピーリングとは異なり、これはサンプル精度です。さらに、アルゴリズムのパフォーマンスは通常、フラグメントごと(および各フラグメント内のオーバーラップごとにある程度)です。したがって、透明なものをあまり描画しなかった場合、パフォーマンスは最小限になります。

テクニックにわかりやすい名前があるかどうかはわかりませんが、GL4.2より前の実装の1つがここにあります。D3D11バージョンは(パワーポイント、PPSX、リブレ互換)ここで見つけることができます。


この回答の良い点。私が個人的にも十分に満足します(これは回避策として、私の回答で説明しました)。リストしたテクニックのほとんどは、おそらくそれらの価値よりも問題が多いためです。また、最後に興味深いテクニックでしたが、私の回答を調査したリアルタイムレンダリングにリストされていなかったと思います。DX11レベルの機能に関しては、私はまったくの初心者です。
David Gouveia

「GL4.2以前の1つの実装はここにあります」404
Jeroen van Langen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.