WuhuIslandTesting/Library/PackageCache/com.unity.render-pipelines.universal@8148.0.7-4/Runtime/Overrides/Volumetrics.cs
2025-01-07 02:06:59 +01:00

132 lines
5.9 KiB
C#

using System;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace UnityEngine.Rendering.Universal
{
[Serializable, VolumeComponentMenu("Atmospherics/Volumetrics")]
public sealed class Volumetrics : VolumeComponent
{
//static readonly int m_MipFogParam = Shader.PropertyToID("_MipFogParameters");
static readonly int m_GlobalExtinction = Shader.PropertyToID("_GlobalExtinction");
static readonly int m_FogBaseHeight = Shader.PropertyToID("_FogBaseHeight");
static readonly int m_FogMaxHeight = Shader.PropertyToID("_FogMaxHeight");
static readonly int m_StaticLightMultiplier = Shader.PropertyToID("_StaticLightMultiplier");
static readonly int m_VolumetricAlbedo = Shader.PropertyToID("_GlobalScattering");
// Volumetric rendering scripts need to be aware that this script has
// set the shader global variables so they don't overwrite them
public static bool hasSetGlobals { get; private set; }
//static readonly int m_SkyTexture = Shader.PropertyToID("_SkyTexture");
//static readonly int m_SkyMipCount = Shader.PropertyToID("_SkyMipCount");
[Header("Fog Mipmap controls")]
[Tooltip("How close the mipfog starts")]
public MinFloatParameter mipFogNear = new MinFloatParameter( 0.0f , 0 );
[Tooltip("Where the mipfog ends")]
public MinFloatParameter mipFogFar = new MinFloatParameter( 1, 1 );
[Tooltip("Max mip level.")]
public ClampedFloatParameter mipFogMaxMip = new ClampedFloatParameter(1.0f, 0.0f, 1);
public CubemapParameter SkyTexture = new CubemapParameter(null);
[Space, Header("Voulmetric Controls")]
[Tooltip("Controls the global fog Density.")]
public MinFloatParameter FogViewDistance = new MinFloatParameter(50, 1f);
[Tooltip("Height in world space where fog hits max density.")]
public FloatParameter FogBaseHeight = new FloatParameter(0);
[Tooltip("Height in world space where fog is minimum density.")]
public FloatParameter FogMaxHeight = new FloatParameter(50);
[Tooltip("Controls the global fog Density."),HideInInspector]
public ClampedFloatParameter MaxRenderDistance = new ClampedFloatParameter(50, 1f, 3000f); //Disabled until hooked up
[Tooltip("Baked static light multiplier.")]
public MinFloatParameter GlobalStaticLightMultiplier = new MinFloatParameter(1f, .1f);
public ColorParameter VolumetricAlbedo = new ColorParameter(Color.white,false);
[HideInInspector]
public BoolParameter isNullSky = new BoolParameter(true);
//public BoolParameter testBool = new BoolParameter(false);
// public bool IsActive() => intensity.value > 0f && (type.value != FilmGrainLookup.Custom || texture.value != null);
// public bool IsTileCompatible() => true;
internal void PushFogShaderParameters()
{
hasSetGlobals = true;
Shader.SetGlobalFloat(m_GlobalExtinction, VolumeRenderingUtils.ExtinctionFromMeanFreePath(FogViewDistance.value) ); //ExtinctionFromMeanFreePath
Shader.SetGlobalFloat(m_StaticLightMultiplier, GlobalStaticLightMultiplier.value);
Shader.SetGlobalFloat(m_FogBaseHeight, FogBaseHeight.value);
Shader.SetGlobalFloat(m_FogMaxHeight, FogMaxHeight.value);
Shader.SetGlobalVector(m_VolumetricAlbedo, VolumetricAlbedo.value);
SkyManager.SetSkyMips(new Vector4(mipFogNear.value, mipFogFar.value, mipFogMaxMip.value, 0.0f));
//if (SkyTexture.value != null && SkyTexture.overrideState) SkyManager.SetSkyTexture(SkyTexture.value);
//else SkyManager.CheckSky();
//if (isNullSky.value)
//{
// Debug.Log("Null Sky was Set");
//}
if (SkyTexture.overrideState && !isNullSky.value && SkyTexture.value)
{
SkyManager.SetSkyTexture(SkyTexture.value);
}
else
{
SkyManager.CheckSky();
}
// Only check if skytexture.value is null once and cache the result.
// For some reason, checking if a null texture is null causes a 0.15ms of Loading.IsObjectAvailable (when the actual rendering only takes 0.04ms!).
// This doesn't seem to happen if the texture is non-null
//if (!hasCheckedForNullOverride)
//if (SkyTexture.overrideState)
//{
// if (!checkedNullSky.value)
// {
// checkedNullSky.value = true;
// if (SkyTexture.value == null)
// {
// SkyTexture.overrideState = false;
// SkyManager.CheckSky();
// }
// }
// else
// {
// SkyManager.SetSkyTexture(SkyTexture.value); // SkyTexture.value != null &&
// }
//}
//else SkyManager.CheckSky();
}
#if false //UNITY_EDITOR
// Only check if SkyTexture.value is null in editor and serialize the result.
// For some reason, checking if the texture inside of a CubemapParameter is null causes a 0.15ms of Loading.IsObjectAvailable if it actually is null.
private void OnValidate()
{
if (isNullSky == null)
{
isNullSky = new BoolParameter(false);
}
//isNullSky.value = SkyTexture.value == null;
//isNullSky.overrideState = true;
SerializedObject so = new SerializedObject(this);
SerializedProperty sp_value = so.FindProperty("isNullSky.m_Value");
SerializedProperty sp_override = so.FindProperty("isNullSky.m_OverrideState");
sp_value.boolValue = SkyTexture.value == null;
sp_override.boolValue = true;
so.ApplyModifiedProperties();
so.Dispose();
}
#endif
}
}