Files
SXDMystery/Assets/Editor/EdgeDashedOutlineFeature.cs
2025-12-11 11:24:43 +08:00

71 lines
2.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class EdgeDashedOutlineFeature : ScriptableRendererFeature
{
class EdgePass : ScriptableRenderPass
{
private Material material;
private RenderTargetIdentifier source;
private RenderTargetHandle tempTarget;
public EdgePass(Material mat)
{
material = mat;
tempTarget.Init("_TempEdgeTex");
}
public void Setup(RenderTargetIdentifier src)
{
source = src;
}
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{
// 在这里安全获取 camera target 描述
var desc = renderingData.cameraData.cameraTargetDescriptor;
desc.depthBufferBits = 0;
// 分配临时RT
cmd.GetTemporaryRT(tempTarget.id, desc);
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
CommandBuffer cmd = CommandBufferPool.Get("EdgeDashedOutline");
// 这里才能安全访问 sourcecameraColorTarget
Blit(cmd, source, tempTarget.Identifier(), material);
Blit(cmd, tempTarget.Identifier(), source);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
public override void OnCameraCleanup(CommandBuffer cmd)
{
cmd.ReleaseTemporaryRT(tempTarget.id);
}
}
public Material outlineMat;
EdgePass pass;
public override void Create()
{
pass = new EdgePass(outlineMat);
// 指定渲染阶段(默认 AfterRenderingTransparents
pass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents;
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
// 这里不能访问 cameraColorTarget只能传入 renderer.cameraColorTarget 的引用
pass.Setup(renderer.cameraColorTarget);
renderer.EnqueuePass(pass);
}
}