升级水插件
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
// 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
|
||||
Reference in New Issue
Block a user