2024-11-01 16:55:46 +08:00

78 lines
2.5 KiB
C#

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
[ExecuteAlways, DefaultExecutionOrder(600)]
public class FullscreenQuad : MonoBehaviour
{
private CameraFullscreenQuad _pass;
public RenderPassEvent injectionPoint = RenderPassEvent.BeforeRenderingTransparents;
public int injectionPointOffset = 0;
public Material material;
public ScriptableRenderPassInput inputRequirements;
private void OnEnable()
{
_pass = new CameraFullscreenQuad();
// setup callback
RenderPipelineManager.beginCameraRendering += OnBeginCamera;
}
private void OnDisable()
{
RenderPipelineManager.beginCameraRendering -= OnBeginCamera;
}
private void OnBeginCamera(ScriptableRenderContext context, Camera cam)
{
//if (_pass == null) return;
// injection point
_pass.renderPassEvent = injectionPoint + injectionPointOffset;
_pass.passMaterial = material;
_pass.inputReq = inputRequirements;
// inject pass
cam.GetUniversalAdditionalCameraData().scriptableRenderer.EnqueuePass(_pass);
}
private class CameraFullscreenQuad : ScriptableRenderPass
{
public Material passMaterial;
private LocalKeyword keyword;
public ScriptableRenderPassInput inputReq = ScriptableRenderPassInput.None;
public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
{
if (passMaterial != null)
{
keyword = new LocalKeyword(passMaterial.shader, "_FLIPY");
}
ConfigureInput(inputReq);
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
//if (passMaterial == null) return;
// do render
Debug.Log("injecting pass");
var cmd = CommandBufferPool.Get("CameraFullscreenQuad");
var flipY = renderingData.cameraData.IsRenderTargetProjectionMatrixFlipped(renderingData.cameraData.renderer.cameraColorTargetHandle);
passMaterial.SetKeyword(keyword, flipY);
var cam = renderingData.cameraData.camera;
passMaterial.SetMatrix("_InverseViewProjection", (GL.GetGPUProjectionMatrix(cam.projectionMatrix, false) * cam.worldToCameraMatrix).inverse);
CoreUtils.DrawFullScreen(cmd, passMaterial);
context.ExecuteCommandBuffer(cmd);
cmd.Clear();
}
}
}