Santarh / MToon

Toon Shader with Unity Global Illumination

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

GI Intensityを1にしてDirectionalLightの方向を上向きにすると明るさが変わる

m-sigepon opened this issue · comments

GI Intensityを1にしてシーンのambientカラーの影響を受ける状態にしてDirectionalLightの方向を上に向けるとキャラのライトが当たってない状態としてか暗くなるのですがこれは仕様でしょうか?
ライトが当たってない状態になると解釈したのですが、どの位置にキャラがいるか関係なく上を向くと暗くなるのでこの挙動の解説を頂ければと思います。

gi intensity

まず結論を言うと、MToon のバグや仕様ではなく、Skybox Material に設定されている Shader の仕様です。

この例では、シーンの Environment Lighting の Skybox に Default-Skybox マテリアルを設定されているのだと推察されます。ここは間違いないでしょうか?

Default-Skybox マテリアルに設定されている Skybox/Procedural シェーダは Directional Light の角度に応じて環境光を変化させます。したがって、上向きの Directional Light では夜のような環境光に設定されるため、暗くなります。

これは MToon に特有の現象ではありません。
シーンに Standard シェーダのマテリアルを設定した Sphere をおいて、同じように Directional Light の角度を変化させてみてください。
同じように、上向きの Directional Light の状態では環境光がほぼゼロのような見た目になります。

  • Default-Skybox マテリアルの Skybox
  • Standard シェーダの球体
  • 上向きの Directional Light

の組み合わせで得られる絵。環境光がほぼゼロになっていることが分かる。

image

なお Tweet のほうを拝見いたしましたが GI Intensity は上げすぎるとトゥーンの見た目を失ってしまいますので、基本的には 0.1 のままのほうが良いでしょう。

なるほど、Default-Skyboxのほうへの影響と同じと言うことですね。
たしかに、カラーに気をとられていて見逃していました。
ありがとうございます。
ここら辺の、ドキュメントはスライドが公開されていますがWikiの方にドキュメントを更新していってくれるとありがたいです。

GI Intensityの値了解です。
デフォルト値の0.1推奨承知しました。
1にしましたのは、VRChatで対応するためにGI Intensityでambientカラーを拾えればと思ったのですが、v0.48だと光源がない環境でも綺麗に出るようですが、あるなし両対応させるのは難しい感じでしょうか。

今回の修正は、個人的には以前お会いしてたときに出してた要望がのたぐすさんの方でプルリク投げて実装してもらえてたようなので0.49の方が望んでる処理ではあります。

v0.48だと光源がない環境でも綺麗に出るようですが、あるなし両対応させるのは難しい感じでしょうか。

Unity上の確認環境としては、DirectionalLightを削除(ライトがまったくない状態)でもv0.48のように見えるようになるオプションがあるとありがたいです

Editor 特有の機能を導入することは設定事故につながるのでなるべく避けたいです。
Standard シェーダと同様にライトが無い場合は同じように暗くなる方が動作として理解しやすいという認識です。

Unity上の確認環境としては、DirectionalLightを削除(ライトがまったくない状態)でもv0.48のように見えるようになるオプションがあるとありがたいです

ドキュメント不足は認識しておりますので、善処します。

ここら辺の、ドキュメントはスライドが公開されていますがWikiの方にドキュメントを更新していってくれるとありがたいです。

はい。光源が無いときもキャラが表示される仕様は、一見便利かもしれません。
しかし例えば「ライブ会場で照明が落ちた」シチュエーションでも「キャラだけ表示されてしまう」という「何をどう光源を設定しても真っ暗になってくれない」状態は逆に問題になります。
したがってなるべく Standard のシェーダの仕様に寄せたほうが、結果的に表現の幅は広がると考えます。

v0.48だと光源がない環境でも綺麗に出るようですが、あるなし両対応させるのは難しい感じでしょうか。

こちら、どういったシチュエーションで問題があるのかよければ教えてもらえれば幸いです。

1にしましたのは、VRChatで対応するためにGI Intensityでambientカラーを拾えればと思ったのですが、

ご返答ありがとうございます。

Editor 特有の機能を導入することは設定事故につながるのでなるべく避けたいです。

こちら承知しました。成るべくオプションのような形を避けて解決できればと思います。

ドキュメント不足は認識しておりますので、善処します。

ありがとうございます。他の方のMToon移植も助かるかと思います。

はい。光源が無いときもキャラが表示される仕様は、一見便利かもしれません。
しかし例えば「ライブ会場で照明が落ちた」シチュエーションでも「キャラだけ表示されてしまう」という「何をどう光源を設定しても真っ暗になってくれない」状態は逆に問題になります。
したがってなるべく Standard のシェーダの仕様に寄せたほうが、結果的に表現の幅は広がると考えます。

僕自身、以前お会いしたときにDirectionalLightが黒く(暗く)なった時にはシーンが暗くなっているときなのでキャラが暗くなって欲しいという要望を出したのでDirectionalLightがアプリ製作者自身が設定出来る環境化では最新版の状態が望ましいと考えております。

こちら、どういったシチュエーションで問題があるのかよければ教えてもらえれば幸いです。

v0.48のMToonでは、VRChatでキャラがDirectionalLightが無い環境でもちゃんと見える状態だったのですが、v0.49でユーザーが意図せずDirectionalLightが無い環境では黒くなってしまうため、その問題に対応できないかとUnity上でDirectionalLightが無い環境で明るくする手段を模索していてGI Intensityの値を上げて対応できないか試していました。
しかし、マップのアンビエントカラーの状態によってはやはり暗くv0.48のような見た目を得ることはできませんでした。

その上で、DirectionalLightが無い環境でのキャラの明度の対応ですが、Reflexさんが僕に教えてくれた手法で対応するのは難しいでしょうか?
Reflexさんが行ってる対応は、DirectionalLightが無い場合、Unlit(MToonの場合は、MToonに対して)に対してアンビエントカラー(ShadeSH9())を乗算することで対処されているようです。
https://twitter.com/reflex_1124/status/1088633027759005696
Reflex Shader 2.0の解説を紹介していただいたので参照していただければと思います。
https://qiita.com/reflex1124/items/c867b28d6f6bafd8fedb

このあたり元々考慮していたのですが、最近の PointLight 考慮更新などで少し計算が破壊されてしまった感じがあるので、いま出ている PullRequest で対応できるかもしれないとは思います。
#35

Reflexさんが行ってる対応は、DirectionalLightが無い場合、Unlit(MToonの場合は、MToonに対して)に対してアンビエントカラー(ShadeSH9())を乗算することで対処されているようです。