132 lines
5.9 KiB
C#
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
|
|
}
|
|
}
|