TATIKUNLOG.

主にゲーム作りについて書き留めるブログ。

URPのBloomをドキュメント読みながら使ってみる【Unity】

Bloomのポストエフェクトと言えば、導入すれば何かいい感じになるエフェクトということでよく使われてますよね。

その一方で、なんとなくパラメータを調整してなんとなく良い感じになったらOKみたいな感じで触ってる人は少なくないと……思ってます。私もその一人みたいなところがあったので、ドキュメントを読みながら触っていきたいと思います。

※今回触るのはURPのPost-processingで、Built-inのPostProcessingStackではありません。

実行環境

Unity 2021.1.15f1

Universal RP 11.0.0

Postprocessingのセットアップ

以前に記事にしましたので、リンクを記載しておきます。

tat1kun.hatenablog.com

各プロパティ

f:id:tat1kun:20210725210844p:plain

Bloom

Threshold

f:id:tat1kun:20210725213246p:plain

Bloomを適用する閾値を設定します。 この値より小さい明るさのピクセルにはBloomを適用しません。 マニュアルを読むと、ガンマ空間の輝度値を参照するということが書かれています。 ガンマ色空間については下のリンク先に書かれています。

リニアレンダリング概要 - Unity マニュアル

上の図はそれぞれのThresholdの値による見え方の違いです。 スパっと切れるわけではなく、閾値を大きくすると、Bloomのかかり方が段々弱くなっているのが分かります。

Intensity

f:id:tat1kun:20210725214204p:plain

Bloom効果の強さを設定します。強さは0から1で設定します。

と、0から1で設定するとマニュアルに書かれていますが、普通に1よりも大きく設定できます。 上の画像のように、1より大きくした場合、そのままBloomの効果は強くなります。

とはいえ、こっちで無理に強くして輝かせるのではなく、マテリアルの方で調整した方が適切だと思います。

Scatter

f:id:tat1kun:20210725214943p:plain

Scatterは散乱のことです。Bloom効果の半径、周辺への光の広がりの強さを設定します。 強さは0から1で設定できます。Scatterはスライダーになっているため、Intensityのようにここで1より大きく設定というのはできません。

Tint

f:id:tat1kun:20210725223027p:plain

Tintは色合いのことで、Bloom効果の色合いを設定します。

上の画像では左から、白、オレンジ、青に設定した結果を表示してます。

Clamp

f:id:tat1kun:20210725230331p:plain

UnityがBloomの計算に使用する最大強度を設定します。 Bloomの強度がこの値より大きい場合、この値に収めるように縮められます。 実験として、Scatterを0に設定し、同じIntensityでClampを変えてその見た目の変化を確かめてみました。

High Quality Filtering

今回、Cubeによる違いを確認することができなかったのですが、 ドキュメントによると滑らかさが向上するらしいです。 ただし、リソースを多く消費するらしいので、対象プラットフォームによってONOFFを考えた方が良さそうです。

Skip Iterations

処理シーケンスの最後の反復処理は、レンダリングされたフレームの外観にほとんど寄与しない場合があります。この設定では、スキップする最後の反復処理の数を定義します。この値を大きくすると、処理負荷が軽減され、特にモバイルデバイスでのパフォーマンスが向上します。デフォルト値は1です。(ドキュメント本文から抜粋)

翻訳ソフトで直訳してみましたが、ドキュメントの説明を訳しても内部処理について詳しくない人は意味不明だと思います。なので、少し詳しく見ていきます。

反復処理って何のことだろう?って思ったんですが、これはBloomエフェクトを実装するときのダウンサンプリング実行回数だと思われます。

※ここでのダウンサンプリングは画像の縮小処理を指しています

Frame Debuggerでその挙動を確認してみれば、サンプリング回数が変化していることが確認できます。

f:id:tat1kun:20210725233239p:plain

上図では、Skip Iterationsを0から2まで変化させたときの描画回数を比較しています。

Skip Iterationsを増やすと、Bloomの部分で3ずつ回数が削減されているのが確認できます。 これは、ダウンサンプリング→ガウスぼかし→ぼかし画像を適用の3手順分でしょう。

↓の川瀬のブルームフィルターを実装しているとは限りませんが、ブルームの実装例として参考にしました。

川瀬のブルームフィルター - Wikipedia

Lens Dirt

Texture

テクスチャを割り当てることで、レンズに汚れ(汚れやほこりなど)の効果を与えることができます。

f:id:tat1kun:20210725235447p:plain

適当なテクスチャを適用してみた例です。テクスチャ見たまんまではないのでわかりにくいですが、 テクスチャ中央を着目すると、テクスチャの白い部分で明るくなっているのが確認できます。

Intensity

汚れの強さを設定できます。

Troubleshooting performance issues

処理が重い場合は参考にしてください、的なことが書かれている部分です。まずは原文をそのまま引用して載せておきます。

1.Disable High Quality Filtering. Bloom then uses bilinear filtering instead of bicubic. This reduces the overall smoothness of the Bloom effect, but greatly improves performance, especially on lower-end hardware and platforms. In some extreme cases, you might see blocky graphical artifacts in your Scene.

2.Use a lower resolution Lens Dirt Texture to reduce memory pressure and speed up blending across volumes.

  • High Quality Filteringをオフにすると、ブロック状のアーチファクトが生じることがあるが、パフォーマンスは向上する。

  • Len Dirtに適用するテクスチャの解像度を抑えるとパフォーマンスが向上する。

といったところでしょうか。 ここの記述から察するに、High Quality Filiteringのオンオフによる違いは、ぼかす際のアルゴリズムの違い(バイキュービックとバイリニア)だったみたいですね。

おわりに

書き終わってから、PostProcesingStackV2と項目を比べてみたのですが、思ったより差分があって驚きました。 とりあえずBloomの記事を書きましたが、今後は自分が必要としてる知識から埋めていくように記事を書いていこうかなと思っています。

参考

docs.unity3d.com