Skip to content
This repository was archived by the owner on Nov 30, 2020. It is now read-only.

FogEffect #513

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions PostProcessing/Editor/Effects/FogEditor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;

namespace UnityEditor.Rendering.PostProcessing
{
[PostProcessEditor(typeof(Fog))]
public sealed class FogEditor : PostProcessEffectEditor<Fog>
{
SerializedParameterOverride m_excludeSkybox;
SerializedParameterOverride m_color;
SerializedParameterOverride m_density;
SerializedParameterOverride m_startDistance;
SerializedParameterOverride m_endDistance;
SerializedParameterOverride m_mode;

public override void OnEnable()
{
m_excludeSkybox = FindParameterOverride(x => x.excludeSkybox);
m_color = FindParameterOverride(x => x.color);
m_density = FindParameterOverride(x => x.density);
m_startDistance = FindParameterOverride(x => x.startDistance);
m_endDistance = FindParameterOverride(x => x.endDistance);
m_mode = FindParameterOverride(x => x.mode);
}

public override void OnInspectorGUI()
{
base.OnInspectorGUI();

PropertyField(m_excludeSkybox);
PropertyField(m_color);
PropertyField(m_mode);
if (m_mode.value.intValue == (int)FogMode.Linear)
{
PropertyField(m_startDistance);
PropertyField(m_endDistance);
}
else if (m_mode.value.intValue == (int)FogMode.Exponential || m_mode.value.intValue == (int)FogMode.ExponentialSquared)
{
PropertyField(m_density);
}
}
}
}
13 changes: 13 additions & 0 deletions PostProcessing/Editor/Effects/FogEditor.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

42 changes: 42 additions & 0 deletions PostProcessing/Runtime/Effects/DeferredFog.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System;

namespace UnityEngine.Rendering.PostProcessing
{
[Serializable]
public sealed class DeferredFog
{
[Tooltip("Enables the internal deferred fog pass. Actual fog settings should be set in the Lighting panel.")]
public bool enabled = true;

[Tooltip("Should the fog affect the skybox?")]
public bool excludeSkybox = true;

internal DepthTextureMode GetCameraFlags()
{
return DepthTextureMode.Depth;
}

internal bool IsEnabledAndSupported(PostProcessRenderContext context)
{
return enabled
&& RenderSettings.fog
&& !RuntimeUtilities.scriptableRenderPipelineActive
&& context.resources.shaders.deferredFog
&& context.resources.shaders.deferredFog.isSupported
&& context.camera.actualRenderingPath == RenderingPath.DeferredShading; // In forward fog is already done at shader level
}

internal void Render(PostProcessRenderContext context)
{
var sheet = context.propertySheets.Get(context.resources.shaders.deferredFog);
sheet.ClearKeywords();

var fogColor = RuntimeUtilities.isLinearColorSpace ? RenderSettings.fogColor.linear : RenderSettings.fogColor;
sheet.properties.SetVector(ShaderIDs.FogColor, fogColor);
sheet.properties.SetVector(ShaderIDs.FogParams, new Vector3(RenderSettings.fogDensity, RenderSettings.fogStartDistance, RenderSettings.fogEndDistance));

var cmd = context.command;
cmd.BlitFullscreenTriangle(context.source, context.destination, sheet, excludeSkybox ? 1 : 0);
}
}
}
12 changes: 12 additions & 0 deletions PostProcessing/Runtime/Effects/DeferredFog.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

92 changes: 70 additions & 22 deletions PostProcessing/Runtime/Effects/Fog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,88 @@
namespace UnityEngine.Rendering.PostProcessing
{
[Serializable]
public sealed class Fog
[PostProcess(typeof(FogRenderer), PostProcessEvent.AfterStack, "Unity/Fog")]
public sealed class Fog : PostProcessEffectSettings
{
[Tooltip("Enables the internal deferred fog pass. Actual fog settings should be set in the Lighting panel.")]
public bool enabled = true;
[Serializable]
public sealed class FogModeParameter : ParameterOverride<FogMode> { }

[Tooltip("Should the fog affect the skybox?")]
public bool excludeSkybox = true;
public BoolParameter excludeSkybox = new BoolParameter { value = false };
public ColorParameter color = new ColorParameter { value = Color.gray };
public FloatParameter density = new FloatParameter { value = 0.01f };
public FloatParameter startDistance = new FloatParameter { value = 100 };
public FloatParameter endDistance = new FloatParameter { value = 200 };
public FogModeParameter mode = new FogModeParameter { value = FogMode.Exponential };

internal DepthTextureMode GetCameraFlags()
public override bool IsEnabledAndSupported(PostProcessRenderContext context)
{
return DepthTextureMode.Depth;
// Never rendered directly
return false;
}

internal bool IsEnabledAndSupported(PostProcessRenderContext context)
public override void Reset(PostProcessEffectSettings defaultSettings)
{
return enabled
&& RenderSettings.fog
&& !RuntimeUtilities.scriptableRenderPipelineActive
&& context.resources.shaders.deferredFog
&& context.resources.shaders.deferredFog.isSupported
&& context.camera.actualRenderingPath == RenderingPath.DeferredShading; // In forward fog is already done at shader level
base.Reset(defaultSettings);

enabled.value = RenderSettings.fog;
color.value = RenderSettings.fogColor;
density.value = RenderSettings.fogDensity;
startDistance.value = RenderSettings.fogStartDistance;
endDistance.value = RenderSettings.fogEndDistance;
mode.value = RenderSettings.fogMode;
}
}

public sealed class FogRenderer : PostProcessEffectRenderer<Fog>
{
Fog m_backupSettings = ScriptableObject.CreateInstance<Fog>();

public override void Render(PostProcessRenderContext context)
{
throw new NotSupportedException();
}

static void Load(Fog settings, ref bool excludeSkybox)
{
excludeSkybox = settings.excludeSkybox;
RenderSettings.fog = settings.enabled;
RenderSettings.fogColor = settings.color;
RenderSettings.fogDensity = settings.density;
RenderSettings.fogStartDistance = settings.startDistance;
RenderSettings.fogEndDistance = settings.endDistance;
RenderSettings.fogMode = settings.mode;
}

static void Store(Fog result, bool excludeSkybox)
{
result.excludeSkybox.value = excludeSkybox;
result.enabled.value = RenderSettings.fog;
result.color.value = RenderSettings.fogColor;
result.density.value = RenderSettings.fogDensity;
result.startDistance.value = RenderSettings.fogStartDistance;
result.endDistance.value = RenderSettings.fogEndDistance;
result.mode.value = RenderSettings.fogMode;
}

internal void Render(PostProcessRenderContext context)
public void ApplySettings(PostProcessRenderContext context, ref bool excludeSkybox)
{
var sheet = context.propertySheets.Get(context.resources.shaders.deferredFog);
sheet.ClearKeywords();
// Backup settings
Store(m_backupSettings, excludeSkybox);

// Apply settings
Load(settings, ref excludeSkybox);

var fogColor = RuntimeUtilities.isLinearColorSpace ? RenderSettings.fogColor.linear : RenderSettings.fogColor;
sheet.properties.SetVector(ShaderIDs.FogColor, fogColor);
sheet.properties.SetVector(ShaderIDs.FogParams, new Vector3(RenderSettings.fogDensity, RenderSettings.fogStartDistance, RenderSettings.fogEndDistance));
#if UNITY_EDITOR
if (context.isSceneView && !UnityEditor.SceneView.currentDrawingSceneView.sceneViewState.showFog)
{
RenderSettings.fog = false;
}
#endif
}

var cmd = context.command;
cmd.BlitFullscreenTriangle(context.source, context.destination, sheet, excludeSkybox ? 1 : 0);
public void RestoreSettings(ref bool excludeSkybox)
{
Load(m_backupSettings, ref excludeSkybox);
}
}
}
7 changes: 4 additions & 3 deletions PostProcessing/Runtime/Effects/Fog.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions PostProcessing/Runtime/PostProcessEffectSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,5 +75,13 @@ public int GetHash()
return hash;
}
}

public virtual void Reset(PostProcessEffectSettings defaultSettings)
{
int count = defaultSettings.parameters.Count;

for (int i = 0; i < count; i++)
parameters[i].SetValue(defaultSettings.parameters[i]);
}
}
}
16 changes: 15 additions & 1 deletion PostProcessing/Runtime/PostProcessLayer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public enum Antialiasing
public TemporalAntialiasing temporalAntialiasing;
public SubpixelMorphologicalAntialiasing subpixelMorphologicalAntialiasing;
public FastApproximateAntialiasing fastApproximateAntialiasing;
public Fog fog;
public DeferredFog fog;
public Dithering dithering;

public PostProcessDebugLayer debugLayer;
Expand Down Expand Up @@ -327,6 +327,13 @@ void BuildCommandBuffers()
TextureLerper.instance.BeginFrame(context);
UpdateSettingsIfNeeded(context);

// Fog effect settings
var fogBundle = GetBundle<Fog>();
if (fogBundle != null)
{
fogBundle.CastRenderer<FogRenderer>().ApplySettings(context, ref fog.excludeSkybox);
}

// Lighting & opaque-only effects
var aoBundle = GetBundle<AmbientOcclusion>();
var aoSettings = aoBundle.CastSettings<AmbientOcclusion>();
Expand Down Expand Up @@ -442,6 +449,13 @@ void OnPostRender()
if (RuntimeUtilities.scriptableRenderPipelineActive)
return;

// Restore original fog settings
var fogBundle = GetBundle<Fog>();
if (fogBundle != null)
{
fogBundle.CastRenderer<FogRenderer>().RestoreSettings(ref fog.excludeSkybox);
}

if (m_CurrentContext.IsTemporalAntialiasingActive())
{
m_Camera.ResetProjectionMatrix();
Expand Down
5 changes: 1 addition & 4 deletions PostProcessing/Runtime/PostProcessManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -271,10 +271,7 @@ void ReplaceData(PostProcessLayer postProcessLayer)
foreach (var settings in m_BaseSettings)
{
var target = postProcessLayer.GetBundle(settings.GetType()).settings;
int count = settings.parameters.Count;

for (int i = 0; i < count; i++)
target.parameters[i].SetValue(settings.parameters[i]);
target.Reset(settings);
}
}

Expand Down