2025-10-21 14:18:31 +09:00

147 lines
5.9 KiB
C#

// Stylized Water 3 by Staggart Creations (http://staggart.xyz)
// COPYRIGHT PROTECTED UNDER THE UNITY ASSET STORE EULA (https://unity.com/legal/as-terms)
// • Copying or referencing source code for the production of new asset store, or public, content is strictly prohibited!
// • Uploading this file to a public repository will subject it to an automated DMCA takedown request.
using UnityEngine;
using UnityEngine.Rendering;
#if URP
using UnityEngine.Rendering.Universal;
using UnityEngine.Rendering.Universal.Internal;
using UnityEngine.Rendering.RenderGraphModule;
namespace StylizedWater3
{
public class SetupConstants : ScriptableRenderPass
{
private ProfilingSampler m_ProfilingSampler;
private static readonly int _CausticsProjectionAvailable = Shader.PropertyToID("_CausticsProjectionAvailable");
private static readonly int CausticsProjection = Shader.PropertyToID("CausticsProjection");
private static readonly int _WaterSSRParams = Shader.PropertyToID("_WaterSSRParams");
private static readonly int _WaterSSRSettings = Shader.PropertyToID("_WaterSSRSettings");
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;
/*
//Whilst required for these features, do not impose onto the render pipeline
//User must manage the enabled state of depth texture
if (settings.screenSpaceReflectionSettings.allow || settings.allowDirectionalCaustics)
{
ConfigureInput(ScriptableRenderPassInput.Depth);
}
*/
}
private class PassData
{
public UniversalCameraData cameraData;
public bool directionalCaustics;
public Matrix4x4 causticsProjection;
public bool ssr;
public bool ssrSkybox;
}
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
UniversalLightData lightData = frameData.Get<UniversalLightData>();
UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
#if UNITY_EDITOR || DEVELOPMENT_BUILD
frameData.GetOrCreate<StylizedWaterRenderFeature.DebugData>();
#endif
using (var builder = renderGraph.AddRasterRenderPass<PassData>("Water Constants", out var passData, m_ProfilingSampler))
{
passData.ssr = settings.screenSpaceReflectionSettings.allow;
passData.ssrSkybox = settings.screenSpaceReflectionSettings.reflectEverything;
passData.directionalCaustics = settings.allowDirectionalCaustics;
if (passData.directionalCaustics)
{
//When no lights are visible, main light will be set to -1.
if (lightData.mainLightIndex > -1)
{
mainLight = lightData.visibleLights[lightData.mainLightIndex];
if (mainLight.lightType == LightType.Directional)
{
causticsProjection = Matrix4x4.Rotate(mainLight.light.transform.rotation);
passData.causticsProjection = causticsProjection.inverse;
passData.cameraData = cameraData;
}
else
{
passData.directionalCaustics = false;
}
}
else
{
passData.directionalCaustics = false;
}
}
//Pass should always execute
builder.AllowPassCulling(false);
builder.AllowGlobalStateModification(true);
builder.SetRenderFunc((PassData data, RasterGraphContext rgContext) =>
{
Execute(rgContext.cmd, data);
});
}
}
static void Execute(RasterCommandBuffer cmd, PassData data)
{
cmd.SetGlobalVector(_WaterSSRParams, new Vector4(data.ssr ? 1 : 0, data.ssrSkybox ? 1 : 0, 0));
//Exposed settings not ready yet, would like to refactor the raymarching to use a step-distance, rather than a fixed number of steps.
cmd.SetGlobalVector(_WaterSSRSettings, new Vector4(12, 0.75f, 100f, 1.0f));
cmd.SetGlobalInt(_CausticsProjectionAvailable, data.directionalCaustics ? 1 : 0);
if (data.directionalCaustics)
{
cmd.SetGlobalMatrix(CausticsProjection, data.causticsProjection);
//Sets up the required View- -> Clip-space matrices
NormalReconstruction.SetupProperties(cmd, data.cameraData);
}
}
public override void OnCameraCleanup(CommandBuffer cmd)
{
//Important to disable these features, as the next camera rendering may be using a different renderer altogether
cmd.SetGlobalInt(_CausticsProjectionAvailable, 0);
cmd.SetGlobalVector(_WaterSSRParams, Vector4.zero);
}
public void Dispose()
{
}
#pragma warning disable CS0672
#pragma warning disable CS0618
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { }
#pragma warning restore CS0672
#pragma warning restore CS0618
}
}
#endif