Different Fog settings per Camera

I would like to adjust the fog distance for each camera in my scene.

I looked into this script called CameraRenderSettings but I can’t get it to work.

Anybody know how I can get it to work or another script that accomplish this?

Do you have fog enabled? If so - setting fog distance in OnPreRender should do the trick

Is OnPreRender this script?

If so, I don’t see any parameters for adjusting the distance.

Bump!

Any ideas on how to implement this in a script?

Create and drop this script on any camera and change settings at will in the Inspector:

using UnityEngine;
using System.Collections;
 
public class FogDensity : MonoBehaviour {
  
    public bool fog;
    public Color fogColor;
    public float fogDensity;
    public Color ambientLight;
    public float haloStrength;
    public float flareStrength;
 
    bool previousFog;
    Color previousFogColor;
    float previousFogDensity;
    Color previousAmbientLight;
    float previousHaloStrength;
    float previousFlareStrength;
  
    void OnPreRender()
    {
        previousFog = RenderSettings.fog;
        previousFogColor = RenderSettings.fogColor;
        previousFogDensity = RenderSettings.fogDensity;
        previousAmbientLight = RenderSettings.ambientLight;
        previousHaloStrength = RenderSettings.haloStrength;
        previousFlareStrength = RenderSettings.flareStrength;
        if(fog)
        {
            RenderSettings.fog = fog;
            RenderSettings.fogColor = fogColor;
            RenderSettings.fogDensity = fogDensity;
            RenderSettings.ambientLight = ambientLight;
            RenderSettings.haloStrength = haloStrength;
            RenderSettings.flareStrength = flareStrength;
        }
    }
  
    void OnPostRender()
    {
        RenderSettings.fog = previousFog;
        RenderSettings.fogColor = previousFogColor;
        RenderSettings.fogDensity = previousFogDensity;
        RenderSettings.ambientLight = previousAmbientLight;
        RenderSettings.haloStrength = previousHaloStrength;
        RenderSettings.flareStrength = previousFlareStrength;
    }
}
2 Likes

works great. I added

using UnityEngine;
using System.Collections;

public class FogDensity : MonoBehaviour {
  
    public bool fog;
    public Color fogColor;
    public float fogDensity;
    public FogModes fogMode;
    //public Color ambientLight;
    //public float haloStrength;
    //public float flareStrength;
  
    bool previousFog;
    Color previousFogColor;
    float previousFogDensity;
    FogModes previousFogMode;
    //Color previousAmbientLight;
    //float previousHaloStrength;
    //float previousFlareStrength;
  
    void OnPreRender() {
        previousFog = RenderSettings.fog;
        previousFogColor = RenderSettings.fogColor;
        previousFogDensity = RenderSettings.fogDensity;
        switch (RenderSettings.fogMode) {
        case FogMode.Exponential: previousFogMode = FogModes.Exponential; break;
        case FogMode.ExponentialSquared: previousFogMode = FogModes.ExponentialSquared; break;
        case FogMode.Linear: previousFogMode = FogModes.Linear; break;
        }
        //previousAmbientLight = RenderSettings.ambientLight;
        //previousHaloStrength = RenderSettings.haloStrength;
        //previousFlareStrength = RenderSettings.flareStrength;
        if(fog) {
            RenderSettings.fog = fog;
            RenderSettings.fogColor = fogColor;
            RenderSettings.fogDensity = fogDensity;
            switch (fogMode) {
            case FogModes.Exponential: RenderSettings.fogMode = FogMode.Exponential; break;
            case FogModes.ExponentialSquared: RenderSettings.fogMode = FogMode.ExponentialSquared; break;
            case FogModes.Linear: RenderSettings.fogMode = FogMode.Linear; break;
            }
            //RenderSettings.ambientLight = ambientLight;
            //RenderSettings.haloStrength = haloStrength;
            //RenderSettings.flareStrength = flareStrength;
        }
    }
  
    void OnPostRender() {
        RenderSettings.fog = previousFog;
        RenderSettings.fogColor = previousFogColor;
        RenderSettings.fogDensity = previousFogDensity;
        switch (previousFogMode) {
        case FogModes.Exponential: RenderSettings.fogMode = FogMode.Exponential; break;
        case FogModes.ExponentialSquared: RenderSettings.fogMode = FogMode.ExponentialSquared; break;
        case FogModes.Linear: RenderSettings.fogMode = FogMode.Linear; break;
        }
        //RenderSettings.ambientLight = previousAmbientLight;
        //RenderSettings.haloStrength = previousHaloStrength;
        //RenderSettings.flareStrength = previousFlareStrength;
    }

    public enum FogModes {
        Exponential,
        ExponentialSquared,
        Linear
    }
}

to allow mode selection.
thanks for sharing

1 Like

This was helpful, thank you.

A quick tip: You can add [ExecuteAlways] attribute just above the MonoBehaviour in order to preview the fog in the editor without switching to playmode:

[ExecuteAlways]
public class FogDensity : MonoBehaviour
{
    // ...
}

I would also like to say Thank You to JasonC001 and starikcetin. You saved me an hour or so trying to figure this out.

1 Like