363 lines
12 KiB
C#
363 lines
12 KiB
C#
using UnityEngine;
|
|
|
|
namespace VolumetricFogAndMist
|
|
{
|
|
[CreateAssetMenu(fileName = "VolumetricFogProfile", menuName = "Volumetric Fog Profile", order = 100)]
|
|
public class VolumetricFogProfile : ScriptableObject
|
|
{
|
|
public LIGHTING_MODEL lightingModel;
|
|
|
|
public bool sunCopyColor = true;
|
|
|
|
[Range(0f, 1.25f)]
|
|
public float density = 1f;
|
|
|
|
[Range(0f, 1f)]
|
|
public float noiseStrength = 0.8f;
|
|
|
|
[Range(0f, 500f)]
|
|
public float height = 4f;
|
|
|
|
public float baselineHeight;
|
|
|
|
[Range(0f, 1000f)]
|
|
public float distance;
|
|
|
|
[Range(0f, 5f)]
|
|
public float distanceFallOff;
|
|
|
|
[Range(0f, 2000f)]
|
|
public float maxFogLength = 1000f;
|
|
|
|
[Range(0f, 1f)]
|
|
public float maxFogLengthFallOff;
|
|
|
|
public bool baselineRelativeToCamera;
|
|
|
|
[Range(0f, 1f)]
|
|
public float baselineRelativeToCameraDelay;
|
|
|
|
[Range(0.2f, 10f)]
|
|
public float noiseScale = 1f;
|
|
|
|
[Range(-0.3f, 2f)]
|
|
public float noiseSparse;
|
|
|
|
[Range(1f, 2f)]
|
|
public float noiseFinalMultiplier = 1f;
|
|
|
|
[Range(0f, 1.05f)]
|
|
public float alpha = 1f;
|
|
|
|
public Color color = new Color(0.89f, 0.89f, 0.89f, 1f);
|
|
|
|
public Color specularColor = new Color(1f, 1f, 0.8f, 1f);
|
|
|
|
[Range(0f, 1f)]
|
|
public float specularThreshold = 0.6f;
|
|
|
|
[Range(0f, 1f)]
|
|
public float specularIntensity = 0.2f;
|
|
|
|
public Vector3 lightDirection = new Vector3(1f, 0f, -1f);
|
|
|
|
[Range(-1f, 3f)]
|
|
public float lightIntensity = 0.2f;
|
|
|
|
public Color lightColor = Color.white;
|
|
|
|
[Range(0f, 1f)]
|
|
public float speed = 0.01f;
|
|
|
|
public bool useRealTime;
|
|
|
|
public Vector3 windDirection = new Vector3(-1f, 0f, 0f);
|
|
|
|
[Range(0f, 10f)]
|
|
public float turbulenceStrength;
|
|
|
|
public bool useXYPlane;
|
|
|
|
public Color skyColor = new Color(0.89f, 0.89f, 0.89f, 1f);
|
|
|
|
[Range(0f, 1000f)]
|
|
public float skyHaze = 50f;
|
|
|
|
[Range(0f, 1f)]
|
|
public float skySpeed = 0.3f;
|
|
|
|
[Range(0f, 1f)]
|
|
public float skyNoiseStrength = 0.1f;
|
|
|
|
[Range(0f, 1f)]
|
|
public float skyAlpha = 1f;
|
|
|
|
public float stepping = 12f;
|
|
|
|
public float steppingNear = 1f;
|
|
|
|
public bool dithering;
|
|
|
|
public float ditherStrength = 0.75f;
|
|
|
|
public bool downsamplingOverride;
|
|
|
|
[Range(1f, 8f)]
|
|
public int downsampling = 1;
|
|
|
|
public bool forceComposition;
|
|
|
|
public bool edgeImprove;
|
|
|
|
[Range(1E-05f, 0.005f)]
|
|
public float edgeThreshold = 0.0005f;
|
|
|
|
public bool lightScatteringOverride;
|
|
|
|
public bool lightScatteringEnabled;
|
|
|
|
[Range(0f, 1f)]
|
|
[SerializeField]
|
|
public float lightScatteringDiffusion = 0.7f;
|
|
|
|
[Range(0f, 1f)]
|
|
[SerializeField]
|
|
public float lightScatteringSpread = 0.686f;
|
|
|
|
[Range(4f, 64f)]
|
|
[SerializeField]
|
|
public int lightScatteringSamples = 16;
|
|
|
|
[Range(0f, 50f)]
|
|
[SerializeField]
|
|
public float lightScatteringWeight = 1.9f;
|
|
|
|
[SerializeField]
|
|
[Range(0f, 50f)]
|
|
public float lightScatteringIllumination = 18f;
|
|
|
|
[Range(0.9f, 1.1f)]
|
|
[SerializeField]
|
|
public float lightScatteringDecay = 0.986f;
|
|
|
|
[SerializeField]
|
|
[Range(0f, 0.2f)]
|
|
public float lightScatteringExposure;
|
|
|
|
[Range(0f, 1f)]
|
|
[SerializeField]
|
|
public float lightScatteringJittering = 0.5f;
|
|
|
|
public bool fogVoidOverride;
|
|
|
|
public FOG_VOID_TOPOLOGY fogVoidTopology;
|
|
|
|
[SerializeField]
|
|
[Range(0f, 10f)]
|
|
public float fogVoidFallOff = 1f;
|
|
|
|
public float fogVoidRadius;
|
|
|
|
public Vector3 fogVoidPosition = Vector3.zero;
|
|
|
|
public float fogVoidDepth;
|
|
|
|
public float fogVoidHeight;
|
|
|
|
public void Load(VolumetricFog fog)
|
|
{
|
|
fog.density = density;
|
|
fog.noiseStrength = noiseStrength;
|
|
fog.height = height;
|
|
fog.baselineHeight = baselineHeight;
|
|
fog.distance = distance;
|
|
fog.distanceFallOff = distanceFallOff;
|
|
fog.maxFogLength = maxFogLength;
|
|
fog.maxFogLengthFallOff = maxFogLengthFallOff;
|
|
fog.baselineRelativeToCamera = baselineRelativeToCamera;
|
|
fog.baselineRelativeToCameraDelay = baselineRelativeToCameraDelay;
|
|
fog.noiseScale = noiseScale;
|
|
fog.noiseSparse = noiseSparse;
|
|
fog.noiseFinalMultiplier = noiseFinalMultiplier;
|
|
fog.useXYPlane = useXYPlane;
|
|
fog.lightingModel = lightingModel;
|
|
fog.sunCopyColor = sunCopyColor;
|
|
fog.alpha = alpha;
|
|
fog.color = color;
|
|
fog.specularColor = specularColor;
|
|
fog.specularThreshold = specularThreshold;
|
|
fog.specularIntensity = specularIntensity;
|
|
fog.lightDirection = lightDirection;
|
|
fog.lightIntensity = lightIntensity;
|
|
fog.lightColor = lightColor;
|
|
fog.speed = speed;
|
|
fog.windDirection = windDirection;
|
|
fog.turbulenceStrength = turbulenceStrength;
|
|
fog.useRealTime = useRealTime;
|
|
fog.skyColor = skyColor;
|
|
fog.skyHaze = skyHaze;
|
|
fog.skySpeed = skySpeed;
|
|
fog.skyNoiseStrength = skyNoiseStrength;
|
|
fog.skyAlpha = skyAlpha;
|
|
fog.stepping = stepping;
|
|
fog.steppingNear = steppingNear;
|
|
fog.dithering = dithering;
|
|
fog.ditherStrength = ditherStrength;
|
|
if (downsamplingOverride)
|
|
{
|
|
fog.downsampling = downsampling;
|
|
fog.forceComposition = forceComposition;
|
|
fog.edgeImprove = edgeImprove;
|
|
fog.edgeThreshold = edgeThreshold;
|
|
}
|
|
if (fogVoidOverride)
|
|
{
|
|
fog.fogVoidTopology = fogVoidTopology;
|
|
fog.fogVoidDepth = fogVoidDepth;
|
|
fog.fogVoidFallOff = fogVoidFallOff;
|
|
fog.fogVoidHeight = fogVoidHeight;
|
|
fog.fogVoidPosition = fogVoidPosition;
|
|
fog.fogVoidRadius = fogVoidRadius;
|
|
}
|
|
if (lightScatteringOverride)
|
|
{
|
|
fog.lightScatteringEnabled = lightScatteringEnabled;
|
|
fog.lightScatteringDecay = lightScatteringDecay;
|
|
fog.lightScatteringDiffusion = lightScatteringDiffusion;
|
|
fog.lightScatteringExposure = lightScatteringExposure;
|
|
fog.lightScatteringIllumination = lightScatteringIllumination;
|
|
fog.lightScatteringJittering = lightScatteringJittering;
|
|
fog.lightScatteringSamples = lightScatteringSamples;
|
|
fog.lightScatteringSpread = lightScatteringSpread;
|
|
fog.lightScatteringWeight = lightScatteringWeight;
|
|
}
|
|
}
|
|
|
|
public void Save(VolumetricFog fog)
|
|
{
|
|
density = fog.density;
|
|
noiseStrength = fog.noiseStrength;
|
|
height = fog.height;
|
|
baselineHeight = fog.baselineHeight;
|
|
distance = fog.distance;
|
|
distanceFallOff = fog.distanceFallOff;
|
|
maxFogLength = fog.maxFogLength;
|
|
maxFogLengthFallOff = fog.maxFogLengthFallOff;
|
|
baselineRelativeToCamera = fog.baselineRelativeToCamera;
|
|
baselineRelativeToCameraDelay = fog.baselineRelativeToCameraDelay;
|
|
noiseScale = fog.noiseScale;
|
|
noiseSparse = fog.noiseSparse;
|
|
noiseFinalMultiplier = fog.noiseFinalMultiplier;
|
|
useXYPlane = fog.useXYPlane;
|
|
sunCopyColor = fog.sunCopyColor;
|
|
alpha = fog.alpha;
|
|
color = fog.color;
|
|
specularColor = fog.specularColor;
|
|
specularThreshold = fog.specularThreshold;
|
|
specularIntensity = fog.specularIntensity;
|
|
lightDirection = fog.lightDirection;
|
|
lightIntensity = fog.lightIntensity;
|
|
lightColor = fog.lightColor;
|
|
lightingModel = fog.lightingModel;
|
|
speed = fog.speed;
|
|
windDirection = fog.windDirection;
|
|
turbulenceStrength = fog.turbulenceStrength;
|
|
useRealTime = fog.useRealTime;
|
|
skyColor = fog.skyColor;
|
|
skyHaze = fog.skyHaze;
|
|
skySpeed = fog.skySpeed;
|
|
skyNoiseStrength = fog.skyNoiseStrength;
|
|
skyAlpha = fog.skyAlpha;
|
|
stepping = fog.stepping;
|
|
steppingNear = fog.steppingNear;
|
|
dithering = fog.dithering;
|
|
ditherStrength = fog.ditherStrength;
|
|
downsampling = fog.downsampling;
|
|
forceComposition = fog.forceComposition;
|
|
edgeImprove = fog.edgeImprove;
|
|
edgeThreshold = fog.edgeThreshold;
|
|
fogVoidTopology = fog.fogVoidTopology;
|
|
fogVoidDepth = fog.fogVoidDepth;
|
|
fogVoidFallOff = fog.fogVoidFallOff;
|
|
fogVoidHeight = fog.fogVoidHeight;
|
|
fogVoidPosition = fog.fogVoidPosition;
|
|
fogVoidRadius = fog.fogVoidRadius;
|
|
lightScatteringEnabled = fog.lightScatteringEnabled;
|
|
lightScatteringDecay = fog.lightScatteringDecay;
|
|
lightScatteringDiffusion = fog.lightScatteringDiffusion;
|
|
lightScatteringExposure = fog.lightScatteringExposure;
|
|
lightScatteringIllumination = fog.lightScatteringIllumination;
|
|
lightScatteringJittering = fog.lightScatteringJittering;
|
|
lightScatteringSamples = fog.lightScatteringSamples;
|
|
lightScatteringSpread = fog.lightScatteringSamples;
|
|
lightScatteringSpread = fog.lightScatteringSpread;
|
|
lightScatteringWeight = fog.lightScatteringWeight;
|
|
}
|
|
|
|
public static void Lerp(VolumetricFogProfile profile1, VolumetricFogProfile profile2, float t, VolumetricFog fog)
|
|
{
|
|
if (t < 0f)
|
|
{
|
|
t = 0f;
|
|
}
|
|
else if (t > 1f)
|
|
{
|
|
t = 1f;
|
|
}
|
|
fog.density = profile1.density * (1f - t) + profile2.density * t;
|
|
fog.noiseStrength = profile1.noiseStrength * (1f - t) + profile2.noiseStrength * t;
|
|
fog.height = profile1.height * (1f - t) + profile2.height * t;
|
|
fog.baselineHeight = profile1.baselineHeight * (1f - t) + profile2.baselineHeight * t;
|
|
fog.distance = profile1.distance * (1f - t) + profile2.distance * t;
|
|
fog.distanceFallOff = profile1.distanceFallOff * (1f - t) + profile2.distanceFallOff * t;
|
|
fog.maxFogLength = profile1.maxFogLength * (1f - t) + profile2.maxFogLength * t;
|
|
fog.maxFogLengthFallOff = profile1.maxFogLengthFallOff * (1f - t) + profile2.maxFogLengthFallOff * t;
|
|
fog.baselineRelativeToCamera = ((!(t < 0.5f)) ? profile2.baselineRelativeToCamera : profile1.baselineRelativeToCamera);
|
|
fog.baselineRelativeToCameraDelay = profile1.baselineRelativeToCameraDelay * (1f - t) + profile2.baselineRelativeToCameraDelay * t;
|
|
fog.noiseScale = profile1.noiseScale * (1f - t) + profile2.noiseScale * t;
|
|
fog.noiseSparse = profile1.noiseSparse * (1f - t) + profile2.noiseSparse * t;
|
|
fog.noiseFinalMultiplier = profile1.noiseFinalMultiplier * (1f - t) + profile2.noiseFinalMultiplier * t;
|
|
fog.sunCopyColor = ((!(t < 0.5f)) ? profile2.sunCopyColor : profile1.sunCopyColor);
|
|
fog.alpha = profile1.alpha * (1f - t) + profile2.alpha * t;
|
|
fog.color = profile1.color * (1f - t) + profile2.color * t;
|
|
fog.specularColor = profile1.specularColor * (1f - t) + profile2.specularColor * t;
|
|
fog.specularThreshold = profile1.specularThreshold * (1f - t) + profile2.specularThreshold * t;
|
|
fog.specularIntensity = profile1.specularIntensity * (1f - t) + profile2.specularIntensity * t;
|
|
fog.lightDirection = profile1.lightDirection * (1f - t) + profile2.lightDirection * t;
|
|
fog.lightIntensity = profile1.lightIntensity * (1f - t) + profile2.lightIntensity * t;
|
|
fog.lightColor = profile1.lightColor * (1f - t) + profile2.lightColor * t;
|
|
fog.speed = profile1.speed * (1f - t) + profile2.speed * t;
|
|
fog.windDirection = profile1.windDirection * (1f - t) + profile2.windDirection * t;
|
|
fog.turbulenceStrength = profile1.turbulenceStrength * (1f - t) + profile2.turbulenceStrength * t;
|
|
fog.skyColor = profile1.skyColor * (1f - t) + profile2.skyColor * t;
|
|
fog.skyHaze = profile1.skyHaze * (1f - t) + profile2.skyHaze * t;
|
|
fog.skySpeed = profile1.skySpeed * (1f - t) + profile2.skySpeed * t;
|
|
fog.skyNoiseStrength = profile1.skyNoiseStrength * (1f - t) + profile2.skyNoiseStrength * t;
|
|
fog.skyAlpha = profile1.skyAlpha * (1f - t) + profile2.skyAlpha * t;
|
|
fog.stepping = profile1.stepping * (1f - t) + profile2.stepping * t;
|
|
fog.steppingNear = profile1.steppingNear * (1f - t) + profile2.steppingNear * t;
|
|
fog.dithering = ((!(t < 0.5f)) ? profile2.dithering : profile1.dithering);
|
|
fog.ditherStrength = profile1.ditherStrength * (1f - t) + profile2.ditherStrength * t;
|
|
if (profile1.fogVoidOverride && profile2.fogVoidOverride)
|
|
{
|
|
fog.fogVoidDepth = profile1.fogVoidDepth * (1f - t) + profile2.fogVoidDepth * t;
|
|
fog.fogVoidFallOff = profile1.fogVoidFallOff * (1f - t) + profile2.fogVoidFallOff * t;
|
|
fog.fogVoidHeight = profile1.fogVoidHeight * (1f - t) + profile2.fogVoidHeight * t;
|
|
fog.fogVoidPosition = profile1.fogVoidPosition * (1f - t) + profile2.fogVoidPosition * t;
|
|
fog.fogVoidRadius = profile1.fogVoidRadius * (1f - t) + profile2.fogVoidRadius * t;
|
|
}
|
|
if (profile1.lightScatteringOverride && profile2.lightScatteringOverride)
|
|
{
|
|
fog.lightScatteringDecay = profile1.lightScatteringDecay * (1f - t) + profile2.lightScatteringDecay * t;
|
|
fog.lightScatteringDiffusion = profile1.lightScatteringDiffusion * (1f - t) + profile2.lightScatteringDiffusion * t;
|
|
fog.lightScatteringExposure = profile1.lightScatteringExposure * (1f - t) + profile2.lightScatteringExposure * t;
|
|
fog.lightScatteringIllumination = profile1.lightScatteringIllumination * (1f - t) + profile2.lightScatteringIllumination * t;
|
|
fog.lightScatteringJittering = profile1.lightScatteringJittering * (1f - t) + profile2.lightScatteringJittering * t;
|
|
fog.lightScatteringSamples = (int)((float)profile1.lightScatteringSamples * (1f - t) + (float)profile2.lightScatteringSamples * t);
|
|
fog.lightScatteringSpread = profile1.lightScatteringSpread * (1f - t) + profile2.lightScatteringSpread * t;
|
|
fog.lightScatteringWeight = profile1.lightScatteringWeight * (1f - t) + profile2.lightScatteringWeight * t;
|
|
}
|
|
}
|
|
}
|
|
}
|