Skip to content

Instantly share code, notes, and snippets.

@justcore69
Created August 7, 2023 21:04
Show Gist options
  • Save justcore69/54cb4c4e45840f2c6dd546769d061df0 to your computer and use it in GitHub Desktop.
Save justcore69/54cb4c4e45840f2c6dd546769d061df0 to your computer and use it in GitHub Desktop.
Scriptable Renderer Feature that applies a material to a whole screen
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class FullscreenShaderFeature : ScriptableRendererFeature
{
[SerializeField]
private Material material;
class CustomRenderPass : ScriptableRenderPass
{
[SerializeField]
private Material material;
private RTHandle tempTex, srcTex;
public CustomRenderPass(Material mat) : base()
{
material = mat;
}
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{
srcTex = renderingData.cameraData.renderer.cameraColorTargetHandle;
tempTex = RTHandles.Alloc(new RenderTargetIdentifier("_TempTex"), "_TempTex");
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
CommandBuffer cmd = CommandBufferPool.Get("FullscreenShaderFeature");
RenderTextureDescriptor desc = renderingData.cameraData.cameraTargetDescriptor;
desc.depthBufferBits = 0;
cmd.GetTemporaryRT(Shader.PropertyToID(tempTex.name), desc, FilterMode.Point);
Blit(cmd, srcTex, tempTex, material);
Blit(cmd, tempTex, srcTex);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
public override void OnCameraCleanup(CommandBuffer cmd)
{
tempTex.Release();
}
}
CustomRenderPass m_ScriptablePass;
public override void Create()
{
m_ScriptablePass = new CustomRenderPass(material);
m_ScriptablePass.renderPassEvent = RenderPassEvent.BeforeRenderingPostProcessing;
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
renderer.EnqueuePass(m_ScriptablePass);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment