Weighted blended order-independent transparencyの実装

順番に依存しない半透明の描画技術(Weighted blended order-independent transparency)をDirectX11で実装してみました。
半透明を重ねて表示する場合遠くから順に描画する必要がありますが、この技術を使えば描画順序に関係なくソートした描画結果に似た結果が得られます。


Weighted blended OITについて

参照

Weighted Blended Order-Independent Transparency

透明度が低い(αが大きい)、距離が近い(最後に描画される)ポリゴンほど最終結果に与える影響が大きいため、それを重みにした加重平均で順序通り描画した結果を近似します。

参照資料より、このような式で実装します。

半透明ポリゴンの描画ごとにCi*αi*w(zi)とαi*w(zi)を専用のフレームバッファに加算描画、(1-αi)を1つ前の(1-α)に掛け算(ブレンド処理で可能)していき、最終結果を半透明描画前の画像の色と合成することで実装できます。

重み関数 w(z)

b/(a+z^n)の曲線を使用しました。

参考資料など

Weighted Blended OIT Sample / NVIDIA Documentation
Weighted Blended Order-Independent Transparencyについて / shikihuiku
[UE4] Weighted Blended OITの実装 / もんしょの巣穴blog

描画結果

重み関数w(z)=b/(a+z^n) n=1, w(0.1)=100, w(100)=0.01

検証用にわざと手前の白いポリゴンを最初に描画しています。真ん中の画像がWeighted blended OITの描画結果でソートした場合(左)と似た結果になっています。、ソートしない場合(右)を比べるとポリゴンの順序関係が再現できていることがわかると思います。ただ、近くのポリゴン越しに遠くポリゴンを見た場合、輪郭が浮き出てさらに手前の色の影響が強く受けすぎています(中央右の紫のポリゴン)。
ポリゴンの位置関係が同じならカメラが移動しても描画結果が変わらないはずですが、この方法だとカメラの位置で描画結果が変わります。カメラの動きが激しい場合、違和感があるかもしれません。

ゲームなどでは、ポリゴン単位のソートは計算負荷が重いためメッシュ単位でソートすることが多いと思いますが、半透明の中に半透明ポリゴンのような複雑なメッシュでは破綻します。それを回避するためにメッシュを分割、裏面を表示しないなどデータ作成が面倒になり、余計な時間がかかります。この技術を使えば、このような面倒な作業を大幅に削減できそうです。

と思ったのですが重み関数のパラメータ調整で苦労しそう。
無条件に採用とまではいかないようです。


サンプルプログラム

数字キー(1~3)で描画方法(Weighted blended OIT/Sorted/Unsorted)を切り替えられるようになっています。
Weighted blended order-independent transparency

「Weighted blended order-independent transparencyの実装」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.