Skip to content

Instantly share code, notes, and snippets.

@omergurzoglu
Created December 31, 2023 19:02
Show Gist options
  • Save omergurzoglu/d2328507e91cfe1b174deb996cb3d3c2 to your computer and use it in GitHub Desktop.
Save omergurzoglu/d2328507e91cfe1b174deb996cb3d3c2 to your computer and use it in GitHub Desktop.
FullScreenRenderPass-BeforeSkybox
using UnityEngine;
using UnityEngine.Experimental.Rendering.RenderGraphModule;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class FullScreenRenderFeature3 : ScriptableRendererFeature
{
public enum InjectionPoint
{
BeforeRenderingTransparents = RenderPassEvent.BeforeRenderingTransparents,
BeforeRenderingPostProcessing = RenderPassEvent.BeforeRenderingPostProcessing,
AfterRenderingPostProcessing = RenderPassEvent.AfterRenderingPostProcessing,
BeforeSkybox = RenderPassEvent.BeforeRenderingSkybox
}
public Material passMaterial;
public InjectionPoint injectionPoint = InjectionPoint.AfterRenderingPostProcessing;
public ScriptableRenderPassInput requirements = ScriptableRenderPassInput.Color;
[HideInInspector]
public int passIndex = 0;
private FullScreenRenderPass fullScreenPass;
private bool requiresColor;
private bool injectedBeforeTransparents;
public override void Create()
{
fullScreenPass = new FullScreenRenderPass();
fullScreenPass.renderPassEvent = (RenderPassEvent)injectionPoint;
ScriptableRenderPassInput modifiedRequirements = requirements;
requiresColor = (requirements & ScriptableRenderPassInput.Color) != 0;
injectedBeforeTransparents = injectionPoint <= InjectionPoint.BeforeRenderingTransparents;
if (requiresColor && !injectedBeforeTransparents)
{
modifiedRequirements ^= ScriptableRenderPassInput.Color;
}
fullScreenPass.ConfigureInput(modifiedRequirements);
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
if (passMaterial == null)
{
Debug.LogWarningFormat("Missing Post Processing effect Material. {0} Fullscreen pass will not execute. Check for missing reference in the assigned renderer.", GetType().Name);
return;
}
fullScreenPass.Setup(passMaterial, passIndex, requiresColor, injectedBeforeTransparents, "FullScreenPassRendererFeature", renderingData);
renderer.EnqueuePass(fullScreenPass);
}
protected override void Dispose(bool disposing)
{
fullScreenPass.Dispose();
}
class FullScreenRenderPass : ScriptableRenderPass
{
private static Material s_PassMaterial;
private int m_PassIndex;
private bool m_RequiresColor;
private bool m_IsBeforeTransparents;
private PassData m_PassData;
private ProfilingSampler m_ProfilingSampler;
private RTHandle m_CopiedColor;
private static readonly int m_BlitTextureShaderID = Shader.PropertyToID("_BlitTexture");
public void Setup(Material mat, int index, bool requiresColor, bool isBeforeTransparents, string featureName, in RenderingData renderingData)
{
s_PassMaterial = mat;
m_PassIndex = index;
m_RequiresColor = requiresColor;
m_IsBeforeTransparents = isBeforeTransparents;
m_ProfilingSampler ??= new ProfilingSampler(featureName);
var colorCopyDescriptor = renderingData.cameraData.cameraTargetDescriptor;
colorCopyDescriptor.depthBufferBits = (int) DepthBits.None;
RenderingUtils.ReAllocateIfNeeded(ref m_CopiedColor, colorCopyDescriptor, name: "_FullscreenPassColorCopy");
m_PassData ??= new PassData();
}
public void Dispose()
{
m_CopiedColor?.Release();
}
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{
ResetTarget();
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
ref var cameraData = ref renderingData.cameraData;
var cmd = CommandBufferPool.Get();
if (s_PassMaterial == null)
{
return;
}
if (cameraData.isPreviewCamera)
{
return;
}
using (new ProfilingScope(cmd, profilingSampler))
{
if (m_RequiresColor)
{
var source = cameraData.renderer.cameraColorTargetHandle;
Blitter.BlitCameraTexture(cmd, source, m_CopiedColor);
s_PassMaterial.SetTexture(m_BlitTextureShaderID, m_CopiedColor);
}
CoreUtils.SetRenderTarget(cmd, cameraData.renderer.cameraColorTargetHandle);
CoreUtils.DrawFullScreen(cmd, s_PassMaterial);
}
context.ExecuteCommandBuffer(cmd);
cmd.Clear();
CommandBufferPool.Release(cmd);
}
private class PassData
{
internal Material effectMaterial;
internal int passIndex;
internal TextureHandle source;
public TextureHandle copiedColor;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment