진우의 혼잣말하는 블로그

유니티 URP 렌더링 구조 정리 - Main Thread부터 GPU까지, RenderPass와 CommandBuffer의 실제 흐름

by VR하는소년

항상 URP 프로젝트를 해오면서, URP 정체에 대해서는 궁금해한 적이 없었던 것 같습니다.

그래서, 이번 시간에 Main Thread부터 GPU까지, RenderPass와 CommandBuffer의 실제 흐름을 한 번 살펴보고자 합니다.


들어가며

Unity에서 "CPU와 GPU가 어떻게 일을 나누는가?"를 이해하는 것은 렌더링 최적화의 출발점입니다.

  • 왜 DrawCall이 많으면 느려지는가?
  • Render State 변경은 왜 비용이 드는가?
  • CommandBuffer는 실제로 어디서 생성되고 실행되는가?

위 내용들에 대한 질문을 해소하고 싶으신가요??

 

이 글에서는 Main Thread → URP → RenderPass → CommandBuffer → Render Thread → GPU
흐름을 단계별로 정리하여 궁금증을 해소해보고자 합니다.

 

이 글을 다 읽고 아래 포스팅들도 읽으시면 해소가 될 것입니다!

 

유니티 SRP Batch에 대해 #Draw Call #Batch #Render State

나는 문뜩 궁금해졌다. SRP Batch는 같은 Shader를 공유하는 메테리얼을 사용하면 드로우콜 비용이 줄어든다는 것 알게 된 이후 그렇다면 왜 굳이 Texture Altas를 사용하는 것인지? 너무 궁금해졌다. 

wlsdn629.tistory.com

 

 

Unity Static batcing이란? (실습)

Static batcing(정적 배칭) 이란 드로우 콜을 줄이기 위해 움직이지 않는 메시를 결합 하는 드로우 콜 배칭 방식입니다 드로우 콜 배칭이란? Unity가 메시(Mesh)를 더 적은 드로우 콜로 렌더링 할 수 있

wlsdn629.tistory.com

 


전체 흐름 요약

한 프레임의 렌더링은 다음과 같은 순서로 진행됩니다. 아래 사진은 전체 Flow를 가져온거기 때문에 그냥 흝어 보시면 됩니다. 

하나하나 자세히 볼 것이기에 걱정 안하셔도 됩니다.

한 프레임의 렌더링은 다음과 같은 순서

 

중요한 점은, 같은 프레임 내부의 RenderPass 실행은 직렬 구조라는 것입니다.


Main Thread (CPU 단계)

Main Thread (CPU 단계)

 

Main Thread에서는 다음과 같은 작업이 수행됩니다.

  • Transform 갱신
  • Physics
  • Animation
  • Camera 상태 확정
  • LOD 결정

 

즉, "이번 프레임에서 무엇을 어떻게 그릴 것인가" 에 대한 씬 상태가 확정되는 단계입니다.

이 시점에는 아직 GPU는 관여하지 않습니다.

 

화면을 캡처한다고 생각하시면 됩니다.


URP 단계 – 실제 렌더링 준비

URP 단계 – 실제 렌더링 준비

 

씬 상태가 확정되면 URP가 렌더링 준비를 시작합니다.

 

Culling

카메라에 보이는 오브젝트만 선별합니다.

보이지 않는 오브젝트는 이 프레임에서 DrawCall 자체가 생성되지 않습니다.


Sorting 

정렬은 단순한 정리가 아니라, 렌더링 성능과 결과 정확도에 직접적인 영향을 줍니다.

🔹 Opaque Sorting

  • 목적: 오버드로우 감소
  • 방식: 일반적으로 앞 → 뒤 정렬
  • 이유: Early-Z를 활용해 픽셀 셰이더 실행 최소화

🔹 Transparent Sorting

  • 목적: 블렌딩 정확성
  • 방식: 뒤 → 앞 정렬
  • 이유: 알파 블렌딩은 순서에 민감하기 때문

RenderPass 실행

URP는 단계별 RenderPass를 순차적으로 실행합니다.

  • Shadow Pass
  • Depth Pass
  • Opaque Pass
  • Transparent Pass
  • Custom Pass

각 RenderPass 단계에서는 해당 LightMode에 맞는 Shader Pass만 선택되어 Draw가 이루어집니다.

하나의 오브젝트는 여러 Shader Pass를 가질 수 있으며,
RenderPass 단계에 따라 한 프레임에서 여러 번 Draw될 수 있다.
(예: ShadowCaster / DepthOnly / Forward)

 


Render State 기준 정렬 / 그룹화

Render State 기준 정렬 / 그룹화

 

DrawCall은 무작위로 실행되지 않습니다. URP는 Render State 변경을 최소화하기 위해 정렬합니다.

  • 같은 Shader Pass
  • 같은 Material
  • 같은 Keyword 조합
  • 같은 Blend / ZTest / Cull 상태

목적은 단 하나,

SetState 호출을 최소화하여 CPU(Render Thread) 비용 감소

 

각 Render Pass는 직렬 구조로 진행됩니다.

[ Shadow Pass  →  Depth Pass -> Opaque Pass → Transparent Pass → Custom Pass ]

 

정렬된 구조는 CommandBuffer 기록됩니다.

(이런 것들이 정리 됩니다. SetRenderTarget, BindPipeline, SetDepthState ...)
 

중요한 점은

  • Draw마다 CommandBuffer가 생성되는 것이 아니라,
  • 보통 RenderPass 단위로 CommandBuffer가 기록된다.
  • 이후 ExecuteCommandBuffer()를 통해 제출.

Render Thread – Graphics API Submit

Render Thread – Graphics API Submit

 

ExecuteCommandBuffer가 호출되면,
Render Thread가 CommandBuffer를 Vulkan / D3D / Metal API 호출 형태로 변환하여 Driver에 Submit 합니다.

 

이 시점에서 GPU가 Job Queue에 명령을 받습니다.

 

GPU는 제출된 명령을 실행합니다.

[ VertexRasterFragment Depth Test Blending FrameBuffer Write ]

 

이 단계에서 실제 화면 픽셀이 만들어지고 완성된 프레임이 모니터에 표시됩니다.


 

URP 흐름에 대해 어느정도 이해가 되셨을까요? 

Frame Debugger

 

이 내용들을 보고 어느 정도 이해가 되신다면 Frame Debugger를 보고 이해하는데 있어서 좀 더 수월해지실 겁니다!

 

다들 최적화의 달인이 될 때까지 화이팅~!

블로그의 정보

진우의 혼잣말하는 블로그

VR하는소년

활동하기