71 lines
2.1 KiB
C#
71 lines
2.1 KiB
C#
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");
|
||
|
||
// 这里才能安全访问 source(cameraColorTarget)
|
||
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);
|
||
}
|
||
}
|