
하드웨어가 알아서 수행하는 영역입니다.
개발자는 블렌딩 모드(Add, AlphaBlend 등)와 그리는 순서(Sorting) 설정, 그리고 모바일의 경우 버퍼 처리 방식(Load/Store)을 설정할 수 있습니다.
개요
이 단계는 "섞고 기록하는(Mixing & Writing) 단계"입니다.
6단계(PS)에서 계산된 픽셀의 색상을 기존 화면(Framebuffer)의 색상과 합칩니다.
특히 모바일 GPU 아키텍처인 TBDR(Tile-Based Deferred Rendering) 환경에서는 이 단계의 메모리 관리 설정 하나만으로도 발열과 배터리 성능이 20~30% 이상 차이 날 수 있습니다.
<핵심 목표>
- Correct Sorting : 투명한 물체의 렌더링 순서를 지킵니다.
- Optimize Bandwidth (TBDR) : 모바일 GPU에서 값비싼 메모리 접근(RAM Read/Write)을 최소화합니다.
최적화 방법
1. Render Queue Sorting (렌더링 순서 정렬)
- 설명 : CPU(0단계)에서 카메라 거리를 기준으로 그리기 순서를 정렬합니다.
- 불투명(Opaque) : 앞에서 → 뒤로 (Front-to-Back) -> Early-Z 효율 극대화
- 투명(Transparent) : 뒤에서 → 앞으로 (Back-to-Front) -> 올바른 블렌딩(Alpha Blending)
- 이전 단계의 영향 : (※ 7단계 이전에 효과를 줌)
- Stage 5 (RS) & 6 (PS) : 불투명 물체를 앞에서부터 그리면 가려진 픽셀을 미리 버릴 수 있어 오버드로우를 막습니다.
- 장점 :
- 성능과 화질 동시 확보 : 성능(불투명)과 화질(투명) 두 마리 토끼를 잡습니다.
- 단점 :
- CPU 비용 : 매 프레임 정렬 연산(Sorting) 부하가 발생합니다.
2. Load/Store Action Optimization (모바일 버퍼 최적화)
- 설명 : TBDR (Tile-Based Deferred Rendering) 아키텍처의 핵심 최적화입니다.
- TBDR이란?
- 모바일 GPU(Adreno, Mali 등)는 배터리를 아끼기 위해 화면 전체를 한 번에 그리지 않고, 작은 타일(예: 32x32 픽셀) 단위로 쪼개서 처리합니다.
- 이 타일 처리는 GPU 내부에 있는 아주 빠른 '타일 메모리(On-chip Memory)'에서 이루어집니다.
- 문제점 (병목 구간)
- GPU가 타일 메모리에서 작업을 하려면, 외부의 느린 메인 메모리(System RAM/VRAM)에서 데이터를 가져오거나(Load), 작업 끝난 걸 다시 갖다 놔야(Store) 합니다. 이 과정이 전기를 가장 많이 먹고 발열을 일으킵니다.
- Load Action (그리기 시작할 때)
- Load : "이전 프레임 내용을 RAM에서 가져와." (느림, 오버레이 UI에만 사용)
- Clear : "어차피 새로 칠할 거니까 가져오지 마. 그냥 초기화해." (가장 빠름, 기본 권장)
- Don't Care : "몰라, 쓰레기 값이어도 돼." (빠름)
- Store Action (그리기 끝났을 때)
- Store : "완성된 그림을 RAM에 저장해." (Color Buffer는 필수)
- Don't Care : "이건 저장 안 해도 돼. 버려." (Depth/Stencil Buffer 최적화 핵심)
- 설명 : 깊이(Depth) 정보는 이번 프레임에서 앞뒤 가리는 용도로만 쓰고, 다음 프레임에서는 필요 없으므로 굳이 RAM에 저장할 필요가 없습니다.
- TBDR이란?
- 지금 단계에서 효과 :
- Stage 7 (OM) 자체 : GPU 칩 내부(On-chip)와 외부 메모리(RAM) 사이의 대역폭 사용량을 획기적으로 줄입니다.
- 장점 :
- 모바일 발열/배터리 : 모바일 최적화의 '끝판왕' 중 하나입니다. 잘못된 설정(Load/Store 남발)을 고치는 것만으로도 발열이 잡힙니다.
- 단점 :
- 엔진 설정 필요 : Unity나 Unreal 엔진 세팅이나 렌더 패스(Render Pass) 설정에서 개발자가 직접 확인해줘야 합니다.