見出し画像

Unity : Dynamic Bloom

はじめに

以前のblogで、unity上でmaterialをDynamicに変更する方法、光の表現(Bloom)を投稿しました。
Unity : Changing material from script
Unity : PostProcessing Stack v2 : Bloom

これらは全て、unity上でDynamicに光の表現を行うためのモノでした。
今日は、こちらの紹介になります。

環境

* MacBook Pro(Retina, 15-inch Mid 2015)
* Unity2018.2.2f1

Unity : Dynamic Bloom

Unity : PostProcessing Stack v2 : Bloomに従ってPost Processing設定を行った後、scriptでDynaminに動かします。
ここで、Emissionをscriptから変更したい場合、

material.SetColor("_EmissionColor", new Color(0.0f,0.7f,1.0f,1.0f));
material.SetFloat("_EmissionScaleUI", 6.0f);

と、したくなりますが、実は、shaderは、"_EmissoinColor"しか使用していないません。ですので、emissionを操作したい場合は、以下のようにします。_EmissionColorに設定したColorの要素が、1より値がOverすると、emissionのintensityがzeroを超え、Objectから光が漏れます。

float intensity = 5.0f;
material.EnableKeyword ("_EMISSION");
material.SetColor("_EmissionColor", new Color(0.0f,0.7f,1.0f,1.0f) * intensity);

ここで、

material.EnableKeyword ("_EMISSION");

は、materialのinspector上にある、emissionのcheck boxに相当します。これを操作することで、(何故か)inspector上のそれは、変わらないのですが、動作上は、きちんとcheckが入ります。ちなみに、checkを外すのは、

material.DisableKeyword ("_EMISSION");

さてここで、もう1歩踏み込んで考察してみましょう。Renderer.sharedMaterialで元materialが変更され、実行後も値が変わったままであること、を利用して、scriptから変更された値をcheckしてみました。

float intensity = 2.0f;
material.EnableKeyword ("_EMISSION");
material.SetColor("_EmissionColor", new Color(1.0f,0.0f,0.0f,1.0f) * intensity);

とすると、

color = (191, 0, 0)
intensity    = 1.416925

と、なりました。要素が"1"を超えると、intensityが"0"でなくなると同時に、Colorも変わった(255 -> 191)ことがわかります。漏れた分も考慮して、いい感じになるように、unity側で上手い値を設定してくれているのだろうか? 値の絶対値がどのように算出されているか、は気になるが、現状の結論としては、とりあえず、実機調整することとしましょう。

Source Code

https://github.com/SJ-magic-study-unity/MaterialCol_x_script
から"ControlEmissionColor.cs"をダウンロードしてください。

参考文献/ URL

* Setting emission scale in script

もしよろしければ、サポートをお願いします! 頂いたサポートは、Creatorとしての活動費に充てさせて頂きます。