Files
PrinceOfGlory/Packages/Custom/com.unity.render-pipelines.universal@14.0.9/Runtime/Decal/ScreenSpace/DecalScreenSpaceRenderPass.cs
kridoo 6e91a0c7f0 111
2025-09-15 17:32:08 +08:00

88 lines
3.8 KiB
C#

using System.Collections.Generic;
using UnityEngine.Rendering.Universal.Internal;
namespace UnityEngine.Rendering.Universal
{
internal class DecalDrawScreenSpaceSystem : DecalDrawSystem
{
public DecalDrawScreenSpaceSystem(DecalEntityManager entityManager) : base("DecalDrawScreenSpaceSystem.Execute", entityManager) { }
protected override int GetPassIndex(DecalCachedChunk decalCachedChunk) => decalCachedChunk.passIndexScreenSpace;
}
internal class DecalScreenSpaceRenderPass : ScriptableRenderPass
{
private FilteringSettings m_FilteringSettings;
private ProfilingSampler m_ProfilingSampler;
private List<ShaderTagId> m_ShaderTagIdList;
private DecalDrawScreenSpaceSystem m_DrawSystem;
private DecalScreenSpaceSettings m_Settings;
private bool m_DecalLayers;
public DecalScreenSpaceRenderPass(DecalScreenSpaceSettings settings, DecalDrawScreenSpaceSystem drawSystem, bool decalLayers)
{
renderPassEvent = RenderPassEvent.AfterRenderingSkybox;
var scriptableRenderPassInput = ScriptableRenderPassInput.Depth; // Require depth
ConfigureInput(scriptableRenderPassInput);
m_DrawSystem = drawSystem;
m_Settings = settings;
m_ProfilingSampler = new ProfilingSampler("Decal Screen Space Render");
m_FilteringSettings = new FilteringSettings(RenderQueueRange.opaque, -1);
m_DecalLayers = decalLayers;
m_ShaderTagIdList = new List<ShaderTagId>();
if (m_DrawSystem == null)
m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalScreenSpaceProjector));
else
m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalScreenSpaceMesh));
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
SortingCriteria sortingCriteria = SortingCriteria.None;
DrawingSettings drawingSettings = CreateDrawingSettings(m_ShaderTagIdList, ref renderingData, sortingCriteria);
var cmd = renderingData.commandBuffer;
using (new ProfilingScope(cmd, m_ProfilingSampler))
{
context.ExecuteCommandBuffer(cmd);
cmd.Clear();
RenderingUtils.SetScaleBiasRt(cmd, in renderingData);
NormalReconstruction.SetupProperties(cmd, renderingData.cameraData);
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.DecalNormalBlendLow, m_Settings.normalBlend == DecalNormalBlend.Low);
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.DecalNormalBlendMedium, m_Settings.normalBlend == DecalNormalBlend.Medium);
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.DecalNormalBlendHigh, m_Settings.normalBlend == DecalNormalBlend.High);
if (!DecalRendererFeature.isGLDevice)
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.DecalLayers, m_DecalLayers);
context.ExecuteCommandBuffer(cmd);
cmd.Clear();
m_DrawSystem?.Execute(cmd);
context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref m_FilteringSettings);
}
}
public override void OnCameraCleanup(CommandBuffer cmd)
{
if (cmd == null)
{
throw new System.ArgumentNullException("cmd");
}
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.DecalNormalBlendLow, false);
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.DecalNormalBlendMedium, false);
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.DecalNormalBlendHigh, false);
CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.DecalLayers, false);
}
}
}