118 lines
4.6 KiB
C#
118 lines
4.6 KiB
C#
![]() |
using UnityEngine;
|
|||
|
using UnityEngine.Rendering;
|
|||
|
#if URP
|
|||
|
using UnityEngine.Rendering.Universal;
|
|||
|
using UnityEngine.Rendering.Universal.Internal;
|
|||
|
|
|||
|
namespace StylizedWater2
|
|||
|
{
|
|||
|
public class SetupConstants : ScriptableRenderPass
|
|||
|
{
|
|||
|
private static readonly int _EnableDirectionalCaustics = Shader.PropertyToID("_EnableDirectionalCaustics");
|
|||
|
private static readonly int CausticsProjection = Shader.PropertyToID("CausticsProjection");
|
|||
|
private static readonly int _WaterSSREnabled = Shader.PropertyToID("_WaterSSREnabled");
|
|||
|
private static readonly int _WaterDisplacementPrePassAvailable = Shader.PropertyToID("_WaterDisplacementPrePassAvailable");
|
|||
|
|
|||
|
private bool m_directionalCaustics;
|
|||
|
|
|||
|
private static VisibleLight mainLight;
|
|||
|
private Matrix4x4 causticsProjection;
|
|||
|
|
|||
|
public SetupConstants()
|
|||
|
{
|
|||
|
//Force a unit scale, otherwise affects the projection tiling of the caustics
|
|||
|
causticsProjection = Matrix4x4.Scale(Vector3.one);
|
|||
|
}
|
|||
|
|
|||
|
private StylizedWaterRenderFeature settings;
|
|||
|
|
|||
|
public void Setup(StylizedWaterRenderFeature renderFeature)
|
|||
|
{
|
|||
|
this.settings = renderFeature;
|
|||
|
m_directionalCaustics = settings.directionalCaustics;
|
|||
|
}
|
|||
|
|
|||
|
#if UNITY_2020_2_OR_NEWER
|
|||
|
private ScriptableRenderPassInput requirements;
|
|||
|
#endif
|
|||
|
|
|||
|
#if UNITY_6000_0_OR_NEWER //Silence warning spam
|
|||
|
public override void RecordRenderGraph(UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, ContextContainer frameData) { }
|
|||
|
#endif
|
|||
|
|
|||
|
#if UNITY_6000_0_OR_NEWER
|
|||
|
#pragma warning disable CS0672
|
|||
|
#pragma warning disable CS0618
|
|||
|
#endif
|
|||
|
public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
|
|||
|
{
|
|||
|
#if UNITY_2020_2_OR_NEWER
|
|||
|
//Inform the render pipeline which pre-passes are required
|
|||
|
requirements = ScriptableRenderPassInput.None;
|
|||
|
|
|||
|
//Only when using advanced shading, so don't forcibly enable
|
|||
|
//if(m_directionalCaustics) requirements = ScriptableRenderPassInput.Depth;
|
|||
|
|
|||
|
if (settings.screenSpaceReflectionSettings.enable)
|
|||
|
{
|
|||
|
requirements |= ScriptableRenderPassInput.Color | ScriptableRenderPassInput.Depth;
|
|||
|
}
|
|||
|
|
|||
|
if(settings.displacementPrePassSettings.enable) cmd.EnableShaderKeyword(DisplacementPrePass.KEYWORD);
|
|||
|
else cmd.DisableShaderKeyword(DisplacementPrePass.KEYWORD);
|
|||
|
|
|||
|
cmd.SetGlobalInt(_WaterSSREnabled, settings.screenSpaceReflectionSettings.enable ? 1 : 0);
|
|||
|
cmd.SetGlobalInt(_WaterDisplacementPrePassAvailable, settings.displacementPrePassSettings.enable ? 1 : 0);
|
|||
|
|
|||
|
ConfigureInput(requirements);
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
|
|||
|
{
|
|||
|
CommandBuffer cmd = CommandBufferPool.Get();
|
|||
|
|
|||
|
if (m_directionalCaustics)
|
|||
|
{
|
|||
|
//When no lights are visible, main light will be set to -1.
|
|||
|
if (renderingData.lightData.mainLightIndex > -1)
|
|||
|
{
|
|||
|
mainLight = renderingData.lightData.visibleLights[renderingData.lightData.mainLightIndex];
|
|||
|
|
|||
|
if (mainLight.lightType == LightType.Directional)
|
|||
|
{
|
|||
|
causticsProjection = Matrix4x4.Rotate(mainLight.light.transform.rotation);
|
|||
|
|
|||
|
cmd.SetGlobalMatrix(CausticsProjection, causticsProjection.inverse);
|
|||
|
}
|
|||
|
|
|||
|
#if UNITY_2021_2_OR_NEWER
|
|||
|
//Sets up the required View- -> Clip-space matrices
|
|||
|
NormalReconstruction.SetupProperties(cmd, renderingData.cameraData);
|
|||
|
#endif
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
m_directionalCaustics = false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
cmd.SetGlobalInt(_EnableDirectionalCaustics, m_directionalCaustics ? 1 : 0);
|
|||
|
|
|||
|
context.ExecuteCommandBuffer(cmd);
|
|||
|
CommandBufferPool.Release(cmd);
|
|||
|
}
|
|||
|
|
|||
|
public override void OnCameraCleanup(CommandBuffer cmd)
|
|||
|
{
|
|||
|
cmd.SetGlobalInt(_EnableDirectionalCaustics, 0);
|
|||
|
cmd.SetGlobalInt(_WaterSSREnabled, 0);
|
|||
|
}
|
|||
|
|
|||
|
public void Dispose()
|
|||
|
{
|
|||
|
Shader.SetGlobalInt(_WaterDisplacementPrePassAvailable, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|