Skip to content

Instantly share code, notes, and snippets.

@edom18
Last active September 9, 2023 22:43
Show Gist options
  • Save edom18/df906de4caa6ce7580ffd71dbd657141 to your computer and use it in GitHub Desktop.
Save edom18/df906de4caa6ce7580ffd71dbd657141 to your computer and use it in GitHub Desktop.
Unity URPのScriptableRendererFeatureで画面をキャプチャ
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class CaptureRendererFeature : ScriptableRendererFeature
{
public event System.Action<CaptureRendererFeature> OnCaptured;
[SerializeField] private RenderPassEvent _renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
private CaptureRendererPass _captureRendererPass;
public RenderTexture Buffer { get; private set; }
public bool NeedCapture { get; set; }
public override void Create()
{
if (_captureRendererPass == null)
{
Buffer = new RenderTexture(Screen.width, Screen.height, 1, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB);
Buffer.Create();
_captureRendererPass = new CaptureRendererPass(_renderPassEvent, Buffer);
_captureRendererPass.OnCaptured += () =>
{
NeedCapture = false;
OnCaptured?.Invoke(this);
};
}
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
if (!NeedCapture) return;
renderer.EnqueuePass(_captureRendererPass);
}
#region ### ------------------------------ Pass ------------------------------ ###
private class CaptureRendererPass : ScriptableRenderPass
{
public event System.Action OnCaptured;
private const string kName = nameof(CaptureRendererPass);
private RenderTexture _renderTexture;
public CaptureRendererPass(RenderPassEvent passEvent, RenderTexture renderTexture)
{
renderPassEvent = passEvent;
_renderTexture = renderTexture;
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
CommandBuffer buffer = CommandBufferPool.Get(kName);
ref CameraData cameraData = ref renderingData.cameraData;
if (cameraData.isSceneViewCamera) return;
RenderTargetIdentifier colorAttachmentIdentifier = cameraData.renderer.cameraColorTargetHandle.nameID;
buffer.Blit(colorAttachmentIdentifier, _renderTexture);
context.ExecuteCommandBuffer(buffer);
CommandBufferPool.Release(buffer);
OnCaptured?.Invoke();
}
}
#endregion ### ------------------------------ Pass ------------------------------ ###
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment