UnityでカメラごとにFogのOn/Offを切り替える方法

UnityでFogは[Window] » [Lighting]から設定できますが、全体での設定になるのでカメラごとにFogをOnにしたりOffにしたりという設定ができません。そこで、On/Offを切り替えたい場合はOnPreRender/OnPostRenderで設定するスクリプトを使うという方法があるみたいです。

public class ExampleClass : MonoBehaviour
{
  private bool revertFogState = false;

  void OnPreRender()
  {
    revertFogState = RenderSettings.fog;
    RenderSettings.fog = enabled;
  }

  void OnPostRender()
  {
    RenderSettings.fog = revertFogState;
  }
}

Unity - Scripting API: MonoBehaviour.OnPreRender()より

ちなみに、確かめたことはありませんが、On/Offの切り替えで特別なコストが発生するということはないそうです。

リンク

Unity – Scripting API: MonoBehaviour.OnPreRender()
https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnPreRender.html

Fog per Camera Unity Community
https://forum.unity3d.com/threads/fog-per-camera.119888/

UnityでのZ-fightingの対処方法

重なったポリゴンがチラチラしてみえる現象に悩んでいたところ、これはZ-fightingという現象で、Unityに限らず3DCGでよくある問題なのだそうです。

対策その1

Shaderにデプスオフセットを指定する。

SubShader {
  Offset -1,-1
  ... 以下、略 ...
}

対策その2

カメラのClipping PlaneのNear/Farを狭めに設定する。

対策その3

ポリゴンが重ならないように少し(0.いくつか)ずらす。

リンク

Unity – マニュアル: ShaderLab :カリングと深度テクスチャ
https://docs.unity3d.com/ja/current/Manual/SL-CullAndDepth.html

Unity:シェーダーでZファイティングどうにかする:kelorin joのブロマガ-楽しいもの作らないと死ぬ病気 – ブロマガ
http://ch.nicovideo.jp/kelorinjo/blomaga/ar1128171

【Unity】壁や床の絵がチラチラするアレを何とかする – テラシュールブログ
http://tsubakit1.hateblo.jp/entry/2016/10/26/235900