Version: Unity 6.0 (6000.0)
언어 : 한국어
카메라 내역에 텍스처 추가
URP의 프레임 데이터 텍스처 레퍼런스

URP의 프레임버퍼 페치를 통해 현재 프레임버퍼 가져오기

프레임버퍼 페치를 사용하여 Unity가 지금까지 렌더링한 프레임을 읽어 렌더링 속도를 높일 수 있습니다.

프레임버퍼 페치를 사용하면 렌더 패스가 비디오 메모리가 아닌 GPU의 온칩 메모리에서 프레임버퍼에 액세스할 수 있게 됩니다. 이렇게 하면 GPU가 텍스처를 비디오 메모리로 복사하거나 비디오 메모리에서 복사해오지 않아도 되므로 렌더링 속도가 빨라집니다.

다음 그래픽스 API 중 하나를 사용하는 경우 프레임버퍼 페치가 지원됩니다.

  • Vulkan
  • Metal

프레임버퍼 페치는 TBDR(타일 기반 디퍼드 렌더링)을 사용하는 모바일 기기에서 렌더링 속도를 크게 높입니다. GPU는 렌더 패스 사이의 온칩 타일 메모리에 프레임을 유지하므로 메모리 대역폭 사용량이 작고 처리 시간은 줄어듭니다.

프레임버퍼 페치를 사용하는 경우 URP는 프레임버퍼에 쓰고 프레임버퍼에서 읽는 렌더 패스를 병합합니다. 이는 Render Graph Viewer 창에서 확인할 수 있습니다.

프레임버퍼 페치 사용

렌더 패스에서 프레임버퍼 페치를 사용하려면 다음을 사용하십시오.

  • 이전 렌더 패스의 출력을 새 렌더 패스의 입력으로 설정하는 SetInputAttachment API
  • SAMPLE_TEXTURE2D와 같은 매크로 대신 이전 렌더 패스의 출력을 샘플링하는 프래그먼트 셰이더 코드의 LOAD_FRAMEBUFFER_X_INPUT 매크로

아래 과정에서는 이미 sourceTextureHandle라는 TextureHandle에 쓰는 렌더 패스가 하나 있다고 가정합니다.

  1. 커스텀 셰이더를 생성한 다음 셰이더에서 머티리얼을 생성합니다. 커스텀 셰이더 생성에 대한 상세 내용은 커스텀 셰이더 작성을 참고하십시오.

  2. 커스텀 셰이더의 HLSLPROGRAM 내에서 Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl 파일을 임포트합니다.

    HLSLPROGRAM
    ...
    #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    ...
    ENDHLSL
    
  3. HLSLPROGRAM 내에서 다음 중 하나를 사용하여 이전 렌더 패스의 텍스처를 선언합니다. 예시:

    • FRAMEBUFFER_INPUT_X_HALF
    • FRAMEBUFFER_INPUT_X_FLOAT
    • FRAMEBUFFER_INPUT_X_INT
    • FRAMEBUFFER_INPUT_X_UINT

    예시:

    FRAMEBUFFER_INPUT_X_HALF(0);
    
  4. 프래그먼트 함수에서 LOAD_FRAMEBUFFER_X_INPUT를 사용하여 프레임버퍼 페치를 사용해 텍스처를 샘플링합니다. 예시:

    half4 frag() : SV_Target
    {
        half4 colorFromPreviousRenderPass = LOAD_FRAMEBUFFER_X_INPUT(0, input.positionCS.xy);
        return colorFromPreviousRenderPass;
    }
    
  5. 새 렌더 그래프 렌더 패스에서 생성한 머티리얼을 PassData에 추가합니다. 예시:

    class PassData
    {
        public Material frameBufferFetchMaterial;
    }
    
  6. builder.SetInputAttachment를 사용하여 이전 렌더 패스의 출력을 새 렌더 패스의 입력으로 설정합니다. 예시:

    builder.SetInputAttachment(sourceTextureHandle, 0, AccessFlags.Read);
    
  7. SetRenderFunc 메서드에서 BlitTexture와 같은 커맨드를 사용하여 머티리얼을 사용해 렌더링합니다. 예시:

    static void ExecutePass(PassData data, RasterGraphContext context)
    {
        Blitter.BlitTexture(context.cmd, new Vector4(1, 1, 0, 0), frameBufferFetchMaterial, 1);
    }
    

예제

전체 예시는 렌더 그래프 시스템 URP 패키지 샘플FrameBufferFetch라는 예시를 참고하십시오.

추가 리소스

카메라 내역에 텍스처 추가
URP의 프레임 데이터 텍스처 레퍼런스