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