Files
Fishing2/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.HighDefinition.cs
2026-03-05 00:14:42 +08:00

134 lines
4.3 KiB
C#

// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
#if d_UnityHDRP
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.Rendering.RendererUtils;
namespace WaveHarmonic.Crest
{
partial class SurfaceRenderer
{
internal sealed class WaterSurfaceCustomPass : CustomPass
{
const string k_Name = "Water Surface";
static WaterSurfaceCustomPass s_Instance;
WaterRenderer _Water;
// We disable the pass we want, so target another.
ShaderTagId _ShaderTagID = new("DepthOnly");
static readonly RenderTargetIdentifier[] s_RenderTargets = new RenderTargetIdentifier[2];
public static void Enable(WaterRenderer renderer)
{
var gameObject = CustomPassHelpers.CreateOrUpdate
(
parent: renderer.Container.transform,
k_Name,
hide: !renderer._Debug._ShowHiddenObjects
);
CustomPassHelpers.CreateOrUpdate
(
gameObject,
ref s_Instance,
WaterRenderer.k_DrawWater,
CustomPassInjectionPoint.BeforeTransparent
);
s_Instance._Water = renderer;
s_Instance.targetColorBuffer = TargetBuffer.Camera;
s_Instance.targetDepthBuffer = TargetBuffer.Camera;
}
public static void Disable()
{
// It should be safe to rely on this reference for this reference to fail.
if (s_Instance != null && s_Instance._GameObject != null)
{
// Will also trigger Cleanup below.
s_Instance._GameObject.SetActive(false);
}
}
protected override void Execute(CustomPassContext context)
{
var hdCamera = context.hdCamera;
var camera = hdCamera.camera;
if (!WaterRenderer.ShouldRender(camera, _Water.Surface.Layer))
{
return;
}
// Our reflections do not need them.
if (camera == WaterReflections.CurrentCamera)
{
return;
}
if (_Water.Surface.Material == null)
{
return;
}
if (hdCamera.msaaEnabled)
{
WaterRenderer.s_CameraMSAA = true;
return;
}
var buffer = context.cmd;
buffer.BeginSample(k_DrawWaterSurface);
s_RenderTargets[0] = context.cameraColorBuffer;
s_RenderTargets[1] = context.cameraMotionVectorsBuffer;
CoreUtils.SetRenderTarget(buffer, s_RenderTargets, context.cameraDepthBuffer);
var apv = FrameSettingsField.
#if UNITY_6000_0_OR_NEWER
AdaptiveProbeVolume;
#else
ProbeVolume;
#endif
var rendererConfiguration = HDUtils.GetRendererConfiguration
(
context.hdCamera.frameSettings.IsEnabled(apv),
context.hdCamera.frameSettings.IsEnabled(FrameSettingsField.Shadowmask)
);
if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.MotionVectors))
{
rendererConfiguration |= PerObjectData.MotionVectors;
}
var rld = new RendererListDesc(_ShaderTagID, context.cullingResults, camera)
{
layerMask = 1 << _Water.Surface.Layer,
overrideShader = _Water.Surface.Material.shader,
overrideShaderPassIndex = _Water.Surface.Material.FindPass("Forward"),
renderQueueRange = RenderQueueRange.transparent,
sortingCriteria = SortingCriteria.CommonOpaque,
excludeObjectMotionVectors = false,
rendererConfiguration = rendererConfiguration,
};
buffer.DrawRendererList(context.renderContext.CreateRendererList(rld));
buffer.EndSample(k_DrawWaterSurface);
}
}
}
}
#endif