AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

近寄ると透明になるガラスとカリングの連携

SimpleLODで1階壁、2階壁、各教室、屋上壁みたいな単位でメッシュをまとめています。
おかげでSetPassCallやDrawCallが減少しました(頂点数は増えましたが)
同時にOcculusionCullingを設定してますので、教室に入っていると、他の教室はいっさいレンダリングされませんので、負荷低減にすごく役立っています。
ひとつの教室の頂点数は全体で8千ぐらいありますので。

f:id:yasu9780:20170212185237p:plain
今まで一番やばかった学校全体が入る構図で表示対象が大幅に減った!




ただ、廊下や教室の窓に透明をどうしても使いたい! 廊下を歩く生徒を教室から見たい!
でも、透過設定をすると、OcculusionCullingが「見えている」と判断してカリングをやめてしまいます。


そこで、近寄ると透明になり、離れると不透明になるShaderを作って窓に設定しました。
カメラと頂点の距離を求めて、一定距離を超えるとアルファ値を不透明にし、近いと透明度を設定します。


ただ、実際にやってみると
f:id:yasu9780:20170212183441p:plain


左では表示されている黒板下の教師の立つ板(?)が、右では表示されてません。
OcculusionCullingが「見えない」と判断して、描画を刈ってしまうようです。


tsubakiさんのブログでも透明だとうまく働かないことが書いてあります。

ちなみにシェーダーにTransparent(透過)属性のあるものを
選択している場合、Occluderとして機能しないっぽいです。

tsubakit1.hateblo.jp


具体的に透明度をどういう判断するのかは公式ドキュメント見ても分かりませんね。

docs.unity3d.com


回避策としては、

  • 教室のmeshとまとめる
  • 透明度を見える見えないで完全に変える

などがあるかと思います。

距離で透明度を変えるのはいいアイデアと思うんで、なんとか実現したいものです。


さらに詳しく調べました。結論から言うと、shaderで距離で透明度を変えるやり方はダメです。

あくまでBakeした時点で、不透明な壁なら、実行時に透明化してもcullingされますし、
逆にbakeしたときに透明な壁なら、実行時に不透明化してもcullingされません。
透明にならないプログラムのshaderでも透明の設定があると透明とみなすようです。
カリングして欲しいなら透明はやめましょうってことに(´・ω・`)