Unityシェーダーチュートリアル 不必要なブルームを抑える
シェーダー
皆さん、「ブルーム(Bloom)」は好きですか?
画にインパクトが欲しい時や、リアルな光感を出したい時にはブルームが効果的です。
Unity Asset Store から「Post Processing Stack」をダウンロードすれば、
簡単にブルーム効果を追加できます。
が、しかし・・・何も考えずに適当に設定してしまうと、
スペキュラーエイリアシング的に、パチパチとした想定外のブルームが頻繁に発生します。
ただの皮手袋なのにパチパチしてほしくありません。
今回はこの不必要なブルームを簡単に除去する方法を紹介します。
Standardライティングモデルのコードを改造する
デフォルトのシェーダ―ファイルを変更する
以下のディレクトリを見てください。
[Unityインストールディレクトリ / Editor / Data / CGIncludes]
数十個のシェーダーファイルの中に、UnityPBSLighting.cginc というファイルがあります。
この中身を少し変更するだけで簡単に不必要なブルームが無くなります。
インストールフォルダのファイルを直接変更すれば、デフォルトの Standardシェーダ―や、
Standard Lighting を利用したカスタムシェーダ―に効果が現れます。
(同バージョンの Unity を使ったすべてのプロジェクトに影響が出るのでお勧めしない)
各プロジェクトのシェーダ―フォルダにインポートして変更すれば、
Standard Lighting を利用したカスタムシェーダ―のみに効果が現れます。
出力に制限をかける
設定次第ですが大体の場合において、ブルームと言うのは「かなり明るいところ」に発生するので、
「かなり明るくならない」ように、最終出力に制限をかければ良いのです。
UnityPBSLighting.cginc の90行目あたりにこんな記述があります。
(Unityのバージョンによって多少違いがあるかもしれません)
return c;
あやしいですね。いろいろ計算した後、最終的に出力しているっぽくないですか?
ここを以下のようにします。
return min(1, c);
こうすることで、「かなり明るいところ」だったとしても、
強制的に「ただの白いところ(明るくない)」になります。
あとは、1より大きい数値でブルームが発生するように、
ポストプロセスのパラメーターを調整すれば良いのです。
「1より大きいかなり明るいところ」を作りだす際には、Standard シェーダーの Emission もしくは、
自作の Vertex/Fragment Shader を使えば良いでしょう。
LDRの場合
画作りの設定が HDR ではなく LDR の場合は、0.95 あたりで制限をかけて、
1でブルームが発生するように調整すれば同じような事ができます。