{}!Google Tag Manager end}} URP에서 전체 화면 blit 수행 | Universal RP | 14.0.9
docs.unity3d.com
    목차 표시/숨기기

    URP에서 전체 화면 blit 수행

    이 페이지의 예제는 전체 화면 blit을 수행하는 커스텀 렌더러 기능을 생성하는 방법을 설명합니다.

    예제 개요

    이 예제는 다음 솔루션을 구현합니다.

    • 커스텀 렌더러 기능이 커스텀 렌더 패스를 호출합니다.

    • 렌더 패스가 불투명 텍스처를 현재 렌더러의 카메라 컬러 타겟으로 blit을 수행합니다. 렌더 패스는 커맨드 버퍼를 사용하여 양쪽 눈에 대한 전체 화면 메시를 그립니다.

    이 예제에는 렌더링의 GPU 측을 수행하는 셰이더가 포함되어 있습니다. 이 셰이더는 XR 샘플러 매크로를 사용하여 컬러 버퍼를 샘플링합니다.

    선행 조건

    이 예제를 진행하려면 다음 조건을 충족해야 합니다.

    • Scriptable Render Pipeline Settings 프로퍼티가 URP 에셋을 참조합니다(Project Settings > Graphics > Scriptable Render Pipeline Settings).

    예제 씬 및 게임 오브젝트 생성

    이 예제의 단계를 수행하려면 다음 게임 오브젝트가 포함된 새로운 씬을 생성하십시오.

    1. 큐브를 생성합니다. 큐브가 메인 카메라에서 분명하게 보여야 합니다.

    이제 이 예제의 단계를 따르는 데 필요한 씬이 준비되었습니다.

    예제 구현

    이 섹션에서는 예제 씬 및 게임 오브젝트 생성 섹션에 설명된 대로 씬을 생성했다고 가정합니다.

    다음 단계에 따라 커스텀 렌더 패스를 사용하여 커스텀 렌더러 기능을 생성하십시오.

    1. 새 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);
          }
      }
      
    2. 새 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);
          }
      }
      
    3. 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
              }
          }
      }
      
    4. ColorBlitRendererFeature를 유니버설 렌더러 에셋에 추가합니다.

      렌더러 기능 추가

      렌더러 기능을 추가하는 방법은 렌더러에 렌더러 기능을 추가하는 방법 페이지를 참조하십시오.

      이 예제에서는 Intensity 프로퍼티를 1.5로 설정합니다.

    5. Unity에 다음 뷰가 표시됩니다.

      최종 씬과 게임 뷰

      참고: XR에서 예제를 시각화하기 위해 프로젝트가 XR SDK를 사용하도록 설정하십시오. 프로젝트에 MockHMD XR 플러그인을 추가하십시오. Render Mode 프로퍼티는 Single Pass Instanced로 설정하십시오.

    예제가 완료되었습니다.

    맨 위로
    Copyright © 2023 Unity Technologies —
    • Your Privacy Choices (Cookie Settings)