ハイダイナミックレンジ)LDRと言えば普通、0から1の範囲の数字を、256段階で書き込みます。1画素の容量はRGBとアルファそれぞれに1バイトで、4バイトです。HDRと言う時には、0から65000の範囲の数字を、65000段階で書き込みます。0から1の間はだいたい2000段階くらいになります。LDRでは256段階しかないですから、8倍細かいわけです。LDRとは表現力が全く違ってきます。そのかわり、1画素の容量は倍の8バイトです。HDRの方がいいに決まっているわけです。残念ながら、容量が大きいものは遅いのです。古い機械ではそもそもHDRが使えません。いえ、本来、ブルームエフェクトはHDRなキャンバスが前提の技術です。知っていただきたいと思います。その無理の詳細に踏み込んでいきましょう。キャラの光沢をまぶしくしたいとりあえず冒頭の画面を見てください。アレなキャラの頭がギラリと光っていますね。ブルームエフェクトによって、ハイライトがポリゴン境界をはみ出して光っています。照明計算はしていません。この絵を作るには若干の手間をかける必要があるのです。何も考えずにやってみましょう。背景とキャラを普通に配置します。キャラはメタリックなマテリアルにして、ハイライト以外は暗めにしておきました。さあ、ブルームを有効化しましょう。入れた設定は、RGBそれぞれが0以上のところを1倍の強度でぼかして足すというものです。赤い所は赤が広がるので、まあこうなります。これは設定が悪いですね。設定を変えてみましょう。マシにはなりましたが、背景は光らなくていいですよね。背景がこんなに光ってしまいます。光るのはキャラの頭だけでいいのです。数字を上げてみましょう。0.9以上の所だけを取り出すことにしましたが、やっぱり背景光ってますね。真っ赤な所や、すごく緑な所があるわけです。0.9なんて余裕で超えてしまいます。え、どうすればいいの?ということになるわけです。「すごく光ってる所」、つまりキャラのハイライトの区別がつかないことです。白は1でして、太陽がガッツリ反射してすごく明るい所も同じく1です。後者だけを取り出す、ということはそもそもできません。キャンバスがHDRであれば、こんな問題はありません。65000まで書けるからです。いうことになれば、区別は容易につきます。すごく明るい所だけ取り出してぼかすのは簡単です。問題は、「1までしか入らない」ということにあるのです。LDRでブルームをやるのが無茶、ということの意味がおわかりかと思います。「LDRなキャンバスに1より大きいものが入るようにする」です。え、と思うかもしれません。さっき言いましたからね。解釈を変える、という手があります。「1が入っていたらそれは10のことだ」と後で解釈しなおせばいいのです。最初に描画する時に1/10の値を書き込みます。すれば、「0.1より大きい所だけ取り出してぼかす」ということができます。全部処理が終わってから、結果を10倍すればいいのです。「そんなことができるならそうすればいいじゃん」と思われるかもしれません。これには犠牲が伴います。10分の1で描いて、終わってから10倍まず、背景のテクスチャの色を1/10します。テクスチャをいじるのは面倒なので、マテリアルカラーを乗算して1/10にしましょう。キャラの方はライトの強度を1/10にします。環境光(アンビエント)も1/10にする必要があることに注意してください。Unityの場合LightingSettingsで環境光の強度を下げます。この結果、ブルームなしでこういう絵になります。キャラのハイライトだけは白く残っていますね。1以上にならなかったのはキャンバスがLDRだからです。して明るい色が描き込まれることになります。この状態で、0.1以上を取り出してぼかす設定にしてブルームを有効化してみましょう。処理が終わった後に何倍かすることができるので、それを使います。ColorScaleに10を入れてあり、これで10倍になります。ブルームの強度はほどよく調整して(この例では4くらい)みました。この四角いガタガタしたのは何なんでしょうか。これが先程言った「犠牲」です。犠牲にしたのは、「精度」です。LDRの場合、0から1を256段階で表していました。25段階になってしまいます。汚ないのがおわかりでしょうか。後から10倍すれば、汚ないのは当然です。万とかの桁になります。精度のせいで10倍すらままなりません。仕方ないので、2倍で我慢しましょう。明るさを1/2にして描画し、後で2倍して戻します。10を入れた所は2にします。実は、これが冒頭のスクリーンショットです。LDRで無理矢理やるなら我慢するしかないでしょう。意味がなくなってしまいます。まとめ今回紹介したのは、LDRでブルームをやる一番安い方法だと思います。現実的には精度の問題があって2倍が限度でしょう。安いとは言え、後付けで導入するとなると問題は簡単ではありません。最低限、テクスチャをいじらないで描画する明るさを変えられる必要があります。テクスチャを直すコストは到底許容できません。シェーダの差し替えから必要になってしまいます。今回の例のように「照明計算なし(Unlit)」なものがあると、マテリアルの個別設定が必要になります。その意味で、アニメ的な背景や、加算で乗せるエフェクトなどは厄介です。いう手もありますが、背景はそうも行きません。背景はそんなに数はないでしょうけれども、やっぱり手間は手間ですよね。「HDRにしちゃう」という選択肢は当然あります。ブルームをやるならそれが一番素直な選択肢です。遅くならない機械であれば、それでもいいはずです。HDRに切り換える手はあるかと思います。標準のPostProcessingStackを使えばいいでしょう。性能が余っているなら妙な工夫は不要です。性能や機能制限を見ておくのが無難かと思います。(1)月別アーカイブ検索スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。