DirectXの話 第121回

Bilateral Upsampling

前回、HDAO に対して Bilateral Upsampling を施してみました。

効果はあると思うのですが、Bilinear とどの程度違うのか、どんなところに使用したらいいのかなど、気になるところも出てきました。

そこで今回は、HDAO に加えて、パーティクル、ライトにも Bilateral Upsampling を施してみました。

技術解説は前回の通りなので省きます。

前回の Bilateral Upsampling とコードはほぼ同じですが、各ピクセルの totalWeight が 0.0 になることがあるので、各ウェイト値に微小値を加算するようにしています。

上の画像を見ていただければわかりますが、Bilinear と比べると Bilateral の方がやはり綺麗です。

しかし、縮小なしで描画している左の画像と比べると、やはり境目付近の弱さが目立ってしまっています。

なお、今回は速度を無視して実装しているので、縮小バッファを使用すると遅くなる部分もあります。

あくまでも見栄えに注目してください。

まずライトについてですが、これは酷いものです。

ディフューズのみの戦車の方はそれほど問題がないのですが、スペキュラ付きのロボットの方は縮小バッファであることがばれてしまいます。

ロボットの脚のライティングは完全に解像度の低さにやられていますし、腕(?)の辺りは本来ライトが反射すべき場所が黒くなってしまっています。

サンプルではポイントライトを3つしか使っていません。

そのため、Bilateral を使用した方が速度が遅いです。

もっと複雑な計算を、もっと多くのライトで行った場合は速度を稼げるかもしれませんが、少ないライトでは速度面の効果も薄いと思います。

ライトが増えてどうにも遅くなるようでしたら、マルチ解像度で実装する方が見栄えも良くなるんじゃないでしょうか?

マルチ解像度での実装はライトに限らず効果的な場合があります。

境目になっていない部分は低解像度で、境目は高解像度で計算を行う手法です。

低解像度から順番に境目にならない部分を描画して拡大、とやっていけばいいのですが、少々バッファを多めに使うことになるでしょう。

この手法の場合は Bilinear でもいいんじゃないかと思います。やってみたことがないので絶対とは言えませんが。

次に HDAO です。

前回もやったとおり、今回の結果を見ても Bilateral の効果が高いです。

とはいえ、Bilateral でも完璧とは言えず、戦車のキャタピラ付近やロボットの右側面付近に少しばかりハロが出ています。

許容範囲であればこれ1つでもいいと思いますが、もっと綺麗にしたいのであればやはりマルチ解像度で実装すべきでしょう。

HDAO は速度面でも縮小バッファの効果が強く出ています。マルチ解像度でやっても速度的に使い物になると思います。

最後にパーティクルです。

こちらも場所によっては悪くないと思うのですが、戦車の機銃辺りの品質が気になります。

ただ、Bilinear との品質の差が如実に表れているのもその部分です。

Bilinear ではどうしても汚くなってしまっているところが、まあまあ見られるようになっています。

とは言ってもやはり気になりますので、どうしてもという方はマルチ解像度を実践してみた方が良いのではないでしょうか?

パーティクルの場合は遠景のパーティクルを低解像度で、近景を高解像度でという方法もあります。

しかし、パーティクルのコストがフィルにあるようなら(大半はそうでしょう)、近景でのパーティクルの方がフィルが重くなります。

遠景を低解像度にしてもそれほど効果がない場合もあるので注意してください。

HDAO は画面いっぱいのポリゴンを描画するだけなので、重い部分はほぼピクセルフィルとなります。

そのため、低解像度で対応できる部分が多いならその方が良いと言うことになります。

対してパーティクルやライトはそれなりにポリゴン描画を行います。

ピクセルフィルを軽くすることに成功したが、その分頂点計算に時間がかかるようになった、という状況では速度は改善されません。

どの手法が良いのかは各自のアプリケーションによって違いが出てくるでしょう。

やはり、とりあえず実装してみて速度や品質をチェック、良さそうならそのまま使って、ダメなら止める。

結局はアプリケーションと自分たちがどこで納得するかに寄るかと思います。

『The Elder Scrolls V : Skyrim』のように、影とキャラの境目にハロが出てもいいじゃない!と納得できるならそれもありですよね。

サンプルは下から。

Pでカメラが回転を始めます。

メニューは各部分のフィルタリングを指定します。

None は縮小バッファを使用せず、フルスクリーンで処理します。

追記。

法線・深度バッファを縮小する際、サンプルでは深度が最小のものを採用しています。

これを平均値にしてみたところ、少しばかり品質が改善されました。

ちょっとカラーブリーディングする場所もあるのですが、全体的に見るとマシになってる気がします。

と言っても、やはり動かすと境目が気になるんですよね…。

っていうか、この実装間違ってないよね?

追記の追記。

法線・深度バッファを縮小する際に深度が最大のものを採用するようにしたらパーティクルも HDAO もかなり綺麗になりました。

全く気にならないってことはないのですが、以前のものとは雲泥の差です。

と言うことでサンプルを更新したので試してみてください。

あと、トップの画像は以前のサンプルのものなのでご了承ください。