127 lines
6.1 KiB
C#
127 lines
6.1 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Rendering.PostProcessing;
|
|
|
|
public sealed class VolumeFogSM_SRPRenderer : PostProcessEffectRenderer<VolumeFogSM_SRP>
|
|
{
|
|
[SerializeField]
|
|
private bool _useRadialDistance;
|
|
|
|
[SerializeField]
|
|
private bool _fadeToSkybox = true;
|
|
|
|
public override void Render(PostProcessRenderContext context)
|
|
{
|
|
PropertySheet propertySheet = context.propertySheets.Get(Shader.Find("Hidden/InverseProjectVFogLWRP"));
|
|
propertySheet.properties.SetFloat("_DistanceOffset", base.settings._startDistance);
|
|
propertySheet.properties.SetFloat("_Height", base.settings._fogHeight);
|
|
propertySheet.properties.SetFloat("_cameraRoll", base.settings._cameraRoll);
|
|
propertySheet.properties.SetVector("_cameraDiff", base.settings._cameraDiff);
|
|
propertySheet.properties.SetFloat("_cameraTiltSign", base.settings._cameraTiltSign);
|
|
switch (RenderSettings.fogMode)
|
|
{
|
|
case FogMode.Linear:
|
|
{
|
|
float fogStartDistance = RenderSettings.fogStartDistance;
|
|
float fogEndDistance = RenderSettings.fogEndDistance;
|
|
float num = 1f / Mathf.Max(fogEndDistance - fogStartDistance, 1E-06f);
|
|
propertySheet.properties.SetFloat("_LinearGrad", 0f - num);
|
|
propertySheet.properties.SetFloat("_LinearOffs", fogEndDistance * num);
|
|
propertySheet.DisableKeyword("FOG_EXP");
|
|
propertySheet.DisableKeyword("FOG_EXP2");
|
|
break;
|
|
}
|
|
case FogMode.Exponential:
|
|
{
|
|
float fogDensity2 = RenderSettings.fogDensity;
|
|
propertySheet.properties.SetFloat("_Density", 1.442695f * fogDensity2 * (float)base.settings._fogDensity);
|
|
propertySheet.EnableKeyword("FOG_EXP");
|
|
propertySheet.DisableKeyword("FOG_EXP2");
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
float fogDensity = RenderSettings.fogDensity;
|
|
propertySheet.properties.SetFloat("_Density", 1.2011224f * fogDensity * (float)base.settings._fogDensity);
|
|
propertySheet.DisableKeyword("FOG_EXP");
|
|
propertySheet.EnableKeyword("FOG_EXP2");
|
|
break;
|
|
}
|
|
}
|
|
if (_useRadialDistance)
|
|
{
|
|
propertySheet.EnableKeyword("RADIAL_DIST");
|
|
}
|
|
else
|
|
{
|
|
propertySheet.DisableKeyword("RADIAL_DIST");
|
|
}
|
|
if (_fadeToSkybox)
|
|
{
|
|
propertySheet.DisableKeyword("USE_SKYBOX");
|
|
propertySheet.properties.SetColor("_FogColor", base.settings._FogColor);
|
|
}
|
|
else
|
|
{
|
|
propertySheet.DisableKeyword("USE_SKYBOX");
|
|
propertySheet.properties.SetColor("_FogColor", base.settings._FogColor);
|
|
}
|
|
if (base.settings.noiseTexture.value == null)
|
|
{
|
|
base.settings.noiseTexture.value = new Texture2D(1280, 720);
|
|
}
|
|
if (propertySheet != null && base.settings.noiseTexture != null)
|
|
{
|
|
if (base.settings.noiseTexture.value == null)
|
|
{
|
|
base.settings.noiseTexture.value = new Texture2D(1280, 720);
|
|
}
|
|
propertySheet.properties.SetTexture("_NoiseTex", base.settings.noiseTexture.value);
|
|
}
|
|
Camera main = Camera.main;
|
|
Vector3 position = main.transform.position;
|
|
float num2 = position.y - (float)base.settings._fogHeight;
|
|
float z = ((num2 <= 0f) ? 1f : 0f);
|
|
propertySheet.properties.SetVector("_CameraWS", position);
|
|
propertySheet.properties.SetVector("_HeightParams", new Vector4(base.settings._fogHeight, num2, z, (float)base.settings.heightDensity * 0.5f));
|
|
propertySheet.properties.SetVector("_DistanceParams", new Vector4(0f - Mathf.Max(base.settings.startDistance, 0f), 0f, 0f, 0f));
|
|
propertySheet.properties.SetFloat("_NoiseDensity", base.settings.noiseDensity);
|
|
propertySheet.properties.SetFloat("_NoiseScale", base.settings.noiseScale);
|
|
propertySheet.properties.SetFloat("_NoiseThickness", base.settings.noiseThickness);
|
|
propertySheet.properties.SetVector("_NoiseSpeed", base.settings.noiseSpeed);
|
|
propertySheet.properties.SetFloat("_OcclusionDrop", base.settings.occlusionDrop);
|
|
propertySheet.properties.SetFloat("_OcclusionExp", base.settings.occlusionExp);
|
|
propertySheet.properties.SetInt("noise3D", base.settings.noise3D);
|
|
propertySheet.properties.SetFloat("luminance", base.settings.luminance);
|
|
propertySheet.properties.SetFloat("lumFac", base.settings.lumFac);
|
|
propertySheet.properties.SetFloat("Multiplier1", base.settings.ScatterFac);
|
|
propertySheet.properties.SetFloat("Multiplier2", base.settings.TurbFac);
|
|
propertySheet.properties.SetFloat("Multiplier3", base.settings.HorizFac);
|
|
propertySheet.properties.SetFloat("turbidity", base.settings.turbidity);
|
|
propertySheet.properties.SetFloat("reileigh", base.settings.reileigh);
|
|
propertySheet.properties.SetFloat("mieCoefficient", base.settings.mieCoefficient);
|
|
propertySheet.properties.SetFloat("mieDirectionalG", base.settings.mieDirectionalG);
|
|
propertySheet.properties.SetFloat("bias", base.settings.bias);
|
|
propertySheet.properties.SetFloat("contrast", base.settings.contrast);
|
|
propertySheet.properties.SetVector("v3LightDir", base.settings.Sun);
|
|
propertySheet.properties.SetVector("_TintColor", new Vector4(base.settings.TintColor.value.r, base.settings.TintColor.value.g, base.settings.TintColor.value.b, 1f));
|
|
float value = 0f;
|
|
if ((bool)base.settings.FogSky)
|
|
{
|
|
value = 1f;
|
|
}
|
|
propertySheet.properties.SetFloat("FogSky", value);
|
|
propertySheet.properties.SetFloat("ClearSkyFac", base.settings.ClearSkyFac);
|
|
propertySheet.properties.SetVector("localLightPos", new Vector4(base.settings.PointL.value.x, base.settings.PointL.value.y, base.settings.PointL.value.z, base.settings.PointL.value.w));
|
|
propertySheet.properties.SetVector("localLightColor", new Vector4(base.settings.PointLParams.value.x, base.settings.PointLParams.value.y, base.settings.PointLParams.value.z, base.settings.PointLParams.value.w));
|
|
RenderTextureFormat format = (main.allowHDR ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.Default);
|
|
RenderTexture renderTexture = (RenderTexture.active = RenderTexture.GetTemporary(context.width, context.height, 0, format));
|
|
GL.ClearWithSkybox(clearDepth: false, main);
|
|
context.command.BlitFullscreenTriangle(context.source, renderTexture);
|
|
propertySheet.properties.SetTexture("_MainTex", renderTexture);
|
|
Matrix4x4 cameraToWorldMatrix = context.camera.cameraToWorldMatrix;
|
|
propertySheet.properties.SetMatrix("_InverseView", cameraToWorldMatrix);
|
|
context.command.BlitFullscreenTriangle(context.source, context.destination, propertySheet, 0);
|
|
RenderTexture.ReleaseTemporary(renderTexture);
|
|
}
|
|
}
|