78 lines
2.5 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
|
|
|