Files
Fishing2/Assets/KriptoFX/WaterSystem2/WaterResources/Scripts/Standard/CommandPass/WaterPass_URP.cs
2025-06-21 18:06:12 +08:00

142 lines
5.4 KiB
C#

#if KWS_URP
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
#if UNITY_6000_0_OR_NEWER
using UnityEngine.Rendering.RenderGraphModule;
#endif
namespace KWS
{
internal abstract class WaterPass : ScriptableRenderPass
{
public bool ColorPassWriteAccess;
public bool DepthPassWriteAccess;
readonly RenderTargetIdentifier _cameraDepthTextureRT = new RenderTargetIdentifier(Shader.PropertyToID("_CameraDepthTexture"));
readonly static FieldInfo depthTextureFieldInfo = typeof(UniversalRenderer).GetField("m_DepthTexture", BindingFlags.NonPublic | BindingFlags.Instance);
static UnityEngine.Rendering.RTHandle _dummyRT;
public static UnityEngine.Rendering.RTHandle dummyRT
{
get
{
var rt = _dummyRT;
if (rt != null)
{
return rt;
}
return (_dummyRT = UnityEngine.Rendering.RTHandles.Alloc(1, 1, colorFormat: GraphicsFormat.R8G8B8A8_UNorm));
}
}
internal struct WaterPassContext
{
public Camera cam;
public CommandBuffer cmd;
public UnityEngine.Rendering.RTHandle cameraDepth;
public UnityEngine.Rendering.RTHandle cameraColor;
//public int RequiredFixedUpdateCount;
public CustomFixedUpdates FixedUpdates;
public ScriptableRenderContext RenderContext;
public UniversalAdditionalCameraData AdditionalCameraData;
}
WaterPassContext _waterContext;
internal void SetWaterContext(WaterPassContext waterContext)
{
_waterContext = waterContext;
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
//if (useStereoTarget && KWS_CoreUtils.SinglePassStereoEnabled) CoreUtils.SetRenderTarget(cmd, BuiltinRenderTextureType.CurrentActive);
//ConfigureTarget doesnt work properly with configureClear and MRT, so I use CoreUtils.SetRenderTarget anyway.
//But urp rendering requires using ConfigureTarget to indicate "use camera target" or "use custom target"
ConfigureTarget(dummyRT, dummyRT);
Shader.SetGlobalInteger("KWS_AdditionalLightsCount", renderingData.lightData.additionalLightsCount);
_waterContext.cmd = CommandBufferPool.Get(PassName);
_waterContext.cmd.Clear();
_waterContext.cameraColor = renderingData.cameraData.renderer.cameraColorTargetHandle;
_waterContext.cameraDepth = renderingData.cameraData.renderer.cameraDepthTargetHandle;
//_waterContext.cameraDepth = depthTextureFieldInfo.GetValue(renderingData.cameraData.renderer) as RTHandle;
ExecuteCommandBuffer(_waterContext);
_waterContext.RenderContext.ExecuteCommandBuffer(_waterContext.cmd);
CommandBufferPool.Release(_waterContext.cmd);
}
#if UNITY_6000_0_OR_NEWER
private class PassData
{
internal TextureHandle cameraColorTarget;
internal TextureHandle cameraDepthTarget;
}
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameContext)
{
using (var builder = renderGraph.AddUnsafePass<PassData>(PassName, out var passData))
{
UniversalResourceData resourceData = frameContext.Get<UniversalResourceData>();
passData.cameraColorTarget = resourceData.activeColorTexture;
builder.UseTexture(passData.cameraColorTarget, ColorPassWriteAccess ? AccessFlags.Write : AccessFlags.Read);
if (DepthPassWriteAccess)
{
passData.cameraDepthTarget = resourceData.cameraDepthTexture;
builder.UseTexture(passData.cameraDepthTarget, AccessFlags.Write);
}
else
{
passData.cameraDepthTarget = resourceData.activeDepthTexture;
builder.UseTexture(passData.cameraDepthTarget);
}
builder.AllowPassCulling(false);
builder.SetRenderFunc((PassData data, UnsafeGraphContext context) => ExecutePass(data, context));
}
}
void ExecutePass(PassData passData, UnsafeGraphContext context)
{
CommandBuffer cmd = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd);
_waterContext.cameraColor = passData.cameraColorTarget;
_waterContext.cameraDepth = passData.cameraDepthTarget;
_waterContext.cmd = cmd;
ExecuteCommandBuffer(_waterContext);
}
#endif
internal virtual string PassName { get; }
public virtual void ExecuteCommandBuffer(WaterPassContext waterContext) { }
public virtual void ExecuteBeforeCameraRendering(Camera cam, ScriptableRenderContext context) { }
public virtual void ExecutePerFrame(HashSet<Camera> cameras, CustomFixedUpdates fixedUpdates) { }
public abstract void Release();
}
}
#endif