URP에서 전체 화면 blit 수행
이 페이지의 예제는 전체 화면 blit을 수행하는 커스텀 렌더러 기능을 생성하는 방법을 설명합니다.
예제 개요
이 예제는 다음 솔루션을 구현합니다.
커스텀 렌더러 기능이 커스텀 렌더 패스를 호출합니다.
렌더 패스가 불투명 텍스처를 현재 렌더러의 카메라 컬러 타겟으로 blit을 수행합니다. 렌더 패스는 커맨드 버퍼를 사용하여 양쪽 눈에 대한 전체 화면 메시를 그립니다.
이 예제에는 렌더링의 GPU 측을 수행하는 셰이더가 포함되어 있습니다. 이 셰이더는 XR 샘플러 매크로를 사용하여 컬러 버퍼를 샘플링합니다.
선행 조건
이 예제를 진행하려면 다음 조건을 충족해야 합니다.
- Scriptable Render Pipeline Settings 프로퍼티가 URP 에셋을 참조합니다(Project Settings > Graphics > Scriptable Render Pipeline Settings).
예제 씬 및 게임 오브젝트 생성
이 예제의 단계를 수행하려면 다음 게임 오브젝트가 포함된 새로운 씬을 생성하십시오.
큐브를 생성합니다. 큐브가 메인 카메라에서 분명하게 보여야 합니다.
이제 이 예제의 단계를 따르는 데 필요한 씬이 준비되었습니다.
예제 구현
이 섹션에서는 예제 씬 및 게임 오브젝트 생성 섹션에 설명된 대로 씬을 생성했다고 가정합니다.
다음 단계에 따라 커스텀 렌더 패스를 사용하여 커스텀 렌더러 기능을 생성하십시오.
새 C# 스크립트를 생성합니다.
ColorBlitRendererFeature.cs
라고 명명합니다. 이 스크립트는 커스텀 렌더러 기능을 구현합니다.using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; internal class ColorBlitRendererFeature : ScriptableRendererFeature { public Shader m_Shader; public float m_Intensity; Material m_Material; ColorBlitPass m_RenderPass = null; public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { if (renderingData.cameraData.cameraType == CameraType.Game) renderer.EnqueuePass(m_RenderPass); } public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData) { if (renderingData.cameraData.cameraType == CameraType.Game) { // Calling ConfigureInput with the ScriptableRenderPassInput.Color argument // ensures that the opaque texture is available to the Render Pass. m_RenderPass.ConfigureInput(ScriptableRenderPassInput.Color); m_RenderPass.SetTarget(renderer.cameraColorTargetHandle, m_Intensity); } } public override void Create() { m_Material = CoreUtils.CreateEngineMaterial(m_Shader); m_RenderPass = new ColorBlitPass(m_Material); } protected override void Dispose(bool disposing) { CoreUtils.Destroy(m_Material); } }
새 C# 스크립트를 생성합니다.
ColorBlitPass.cs
라고 명명합니다. 이 스크립트는 커스텀 blit 드로우 콜을 수행하는 커스텀 렌더 패스를 구현합니다.이 렌더 패스는
Blitter.BlitCameraTexture
메서드를 사용하여 전체 화면 사각형을 그리고 blit 작업을 수행합니다.참고: 이 메서드는 URP XR 통합과 호환성 문제가 있으므로 URP XR 프로젝트에서
cmd.Blit
메서드를 사용하지 마십시오.cmd.Blit
을 사용하면 XR 셰이더 키워드를 암시적으로 활성화 또는 비활성화하여 XR SPI 렌더링을 중단시킵니다.using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; internal class ColorBlitPass : ScriptableRenderPass { ProfilingSampler m_ProfilingSampler = new ProfilingSampler("ColorBlit"); Material m_Material; RTHandle m_CameraColorTarget; float m_Intensity; public ColorBlitPass(Material material) { m_Material = material; renderPassEvent = RenderPassEvent.BeforeRenderingPostProcessing; } public void SetTarget(RTHandle colorHandle, float intensity) { m_CameraColorTarget = colorHandle; m_Intensity = intensity; } public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { ConfigureTarget(m_CameraColorTarget); } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { var cameraData = renderingData.cameraData; if (cameraData.camera.cameraType != CameraType.Game) return; if (m_Material == null) return; CommandBuffer cmd = CommandBufferPool.Get(); using (new ProfilingScope(cmd, m_ProfilingSampler)) { m_Material.SetFloat("_Intensity", m_Intensity); Blitter.BlitCameraTexture(cmd, m_CameraColorTarget, m_CameraColorTarget, m_Material, 0); } context.ExecuteCommandBuffer(cmd); cmd.Clear(); CommandBufferPool.Release(cmd); } }
blit 동작을 수행하는 셰이더를 생성합니다. 셰이더 파일을
ColorBlit.shader
라고 명명합니다. 버텍스 함수가 전체 화면 사각형 포지션을 출력합니다. 프래그먼트 함수가 컬러 버퍼를 샘플링하여 렌더 타겟에color * float4(0, _Intensity, 0, 1)
값을 반환합니다.Shader "ColorBlit" { SubShader { Tags { "RenderType"="Opaque" "RenderPipeline" = "UniversalPipeline"} LOD 100 ZWrite Off Cull Off Pass { Name "ColorBlitPass" HLSLPROGRAM #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" // The Blit.hlsl file provides the vertex shader (Vert), // input structure (Attributes) and output strucutre (Varyings) #include "Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl" #pragma vertex Vert #pragma fragment frag TEXTURE2D_X(_CameraOpaqueTexture); SAMPLER(sampler_CameraOpaqueTexture); float _Intensity; half4 frag (Varyings input) : SV_Target { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); float4 color = SAMPLE_TEXTURE2D_X(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, input.texcoord); return color * float4(0, _Intensity, 0, 1); } ENDHLSL } } }
ColorBlitRendererFeature
를 유니버설 렌더러 에셋에 추가합니다.렌더러 기능을 추가하는 방법은 렌더러에 렌더러 기능을 추가하는 방법 페이지를 참조하십시오.
이 예제에서는 Intensity 프로퍼티를 1.5로 설정합니다.
Unity에 다음 뷰가 표시됩니다.
참고: XR에서 예제를 시각화하기 위해 프로젝트가 XR SDK를 사용하도록 설정하십시오. 프로젝트에 MockHMD XR 플러그인을 추가하십시오. Render Mode 프로퍼티는 Single Pass Instanced로 설정하십시오.
예제가 완료되었습니다.