ScreenPocket - 画面の隙間

Unityエンジニアの日々の雑記。たまにpython3、DirectX、PhotoshopScript(JavaScript)も触ります

unity_FogParamsの値について

Builtin_Shadersの中で、UnityCG.cgincを見てみると、フォグに関わるマクロについては

UNITY_CALC_FOG_FACTOR フォグの強さを決める+変数定義
UNITY_FOG_COORDS_PACKED フォグ演算(の結果の値を渡すため)に使うテクスチャ座標の定義
UNITY_FOG_COORDS 同上
UNITY_TRANSFER_FOG VS側で使用。モバイル系だと色決め。UNITY_FOG_LERP_COLOR 線形(lerp)で色決め
UNITY_APPLY_FOG_COLOR UNITY_FOG_LERP_COLORで色決め。
UNITY_APPLY_FOG FS側で使用。UNITY_APPLY_FOG_COLORで色決め。

だいたいそんな感じ。

で、その中で使われている unity_FogColor、unity_FogParams ですが、
マニュアルを見るとRenderSettings.fogColorとRenderSettings.fog[Start,End]Distanceと値が紐付いている模様。

fogの設定を切って、自前Fog演算を作る際に、値を拝借してデータ量を削減しようと試みた所、
fogColorについてはunity_FogColorに値が渡されているようですが、
何とfog[Start,End]Distanceについては、unity_FogParams.zwに値が渡っていない…。

どうやら、fogの設定を切るとunity_FogParamsにRenderSettingsからの値が入らなくなるようです。

多分、UNITY_CALC_FOG_FACTORを見た感じ、
unity_FogParams.zには(-1/(end-start))が入っていて、
unity_FogParams.wには(end/(end-start))が入るようなので
その分の演算+値渡しが省かれているのかな?

結局Shader.GlobalVector()を使って、
自前Global変数に(-1/(end-start))と(end/(end-start))を渡すようにしましたが、果たして軽量化できているのか微妙ですね。。