프레임버퍼 페치를 사용하여 Unity가 지금까지 렌더링한 프레임을 읽어 렌더링 속도를 높일 수 있습니다.
프레임버퍼 페치를 사용하면 렌더 패스가 비디오 메모리가 아닌 GPU의 온칩 메모리에서 프레임버퍼에 액세스할 수 있게 됩니다. 이렇게 하면 GPU가 텍스처를 비디오 메모리로 복사하거나 비디오 메모리에서 복사해오지 않아도 되므로 렌더링 속도가 빨라집니다.
다음 그래픽스 API 중 하나를 사용하는 경우 프레임버퍼 페치가 지원됩니다.
프레임버퍼 페치는 TBDR(타일 기반 디퍼드 렌더링)을 사용하는 모바일 기기에서 렌더링 속도를 크게 높입니다. GPU는 렌더 패스 사이의 온칩 타일 메모리에 프레임을 유지하므로 메모리 대역폭 사용량이 작고 처리 시간은 줄어듭니다.
프레임버퍼 페치를 사용하는 경우 URP는 프레임버퍼에 쓰고 프레임버퍼에서 읽는 렌더 패스를 병합합니다. 이는 Render Graph Viewer 창에서 확인할 수 있습니다.
렌더 패스에서 프레임버퍼 페치를 사용하려면 다음을 사용하십시오.
SetInputAttachment APISAMPLE_TEXTURE2D와 같은 매크로 대신 이전 렌더 패스의 출력을 샘플링하는 프래그먼트 셰이더 코드의 LOAD_FRAMEBUFFER_X_INPUT 매크로아래 과정에서는 이미 sourceTextureHandle라는 TextureHandle에 쓰는 렌더 패스가 하나 있다고 가정합니다.
커스텀 셰이더를 생성한 다음 셰이더에서 머티리얼을 생성합니다. 커스텀 셰이더 생성에 대한 상세 내용은 커스텀 셰이더 작성을 참고하십시오.
커스텀 셰이더의 HLSLPROGRAM 내에서 Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl 파일을 임포트합니다.
HLSLPROGRAM
...
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
...
ENDHLSL
HLSLPROGRAM 내에서 다음 중 하나를 사용하여 이전 렌더 패스의 텍스처를 선언합니다. 예시:
FRAMEBUFFER_INPUT_X_HALFFRAMEBUFFER_INPUT_X_FLOATFRAMEBUFFER_INPUT_X_INTFRAMEBUFFER_INPUT_X_UINT예시:
FRAMEBUFFER_INPUT_X_HALF(0);
프래그먼트 함수에서 LOAD_FRAMEBUFFER_X_INPUT를 사용하여 프레임버퍼 페치를 사용해 텍스처를 샘플링합니다. 예시:
half4 frag() : SV_Target
{
half4 colorFromPreviousRenderPass = LOAD_FRAMEBUFFER_X_INPUT(0, input.positionCS.xy);
return colorFromPreviousRenderPass;
}
새 렌더 그래프 렌더 패스에서 생성한 머티리얼을 PassData에 추가합니다. 예시:
class PassData
{
public Material frameBufferFetchMaterial;
}
builder.SetInputAttachment를 사용하여 이전 렌더 패스의 출력을 새 렌더 패스의 입력으로 설정합니다. 예시:
builder.SetInputAttachment(sourceTextureHandle, 0, AccessFlags.Read);
SetRenderFunc 메서드에서 BlitTexture와 같은 커맨드를 사용하여 머티리얼을 사용해 렌더링합니다. 예시:
static void ExecutePass(PassData data, RasterGraphContext context)
{
Blitter.BlitTexture(context.cmd, new Vector4(1, 1, 0, 0), frameBufferFetchMaterial, 1);
}
전체 예시는 렌더 그래프 시스템 URP 패키지 샘플의 FrameBufferFetch라는 예시를 참고하십시오.