유니티 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에서는 다음과 같은 작업이 수행됩니다.
- Transform 갱신
- Physics
- Animation
- Camera 상태 확정
- LOD 결정
즉, "이번 프레임에서 무엇을 어떻게 그릴 것인가" 에 대한 씬 상태가 확정되는 단계입니다.
이 시점에는 아직 GPU는 관여하지 않습니다.
화면을 캡처한다고 생각하시면 됩니다.
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 기준 정렬 / 그룹화

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 기록됩니다.
중요한 점은
- Draw마다 CommandBuffer가 생성되는 것이 아니라,
- 보통 RenderPass 단위로 CommandBuffer가 기록된다.
- 이후 ExecuteCommandBuffer()를 통해 제출.
Render Thread – Graphics API Submit

ExecuteCommandBuffer가 호출되면,
Render Thread가 CommandBuffer를 Vulkan / D3D / Metal API 호출 형태로 변환하여 Driver에 Submit 합니다.
이 시점에서 GPU가 Job Queue에 명령을 받습니다.
GPU는 제출된 명령을 실행합니다.
[ Vertex → Raster → Fragment Depth Test Blending FrameBuffer Write ]
이 단계에서 실제 화면 픽셀이 만들어지고 완성된 프레임이 모니터에 표시됩니다.
URP 흐름에 대해 어느정도 이해가 되셨을까요?

이 내용들을 보고 어느 정도 이해가 되신다면 Frame Debugger를 보고 이해하는데 있어서 좀 더 수월해지실 겁니다!
다들 최적화의 달인이 될 때까지 화이팅~!
블로그의 정보
진우의 혼잣말하는 블로그
VR하는소년