해당 포스팅은 이상윤님께서 공유해주신 2025 TA Campus 수업 문서 링크를 바탕으로 작성했습니다.
3. Render Pass
지금까지 우리는 하나의 오브젝트가 GPU를 거쳐 화면에 그려지기까지의 전체 흐름을 살펴봤다. 하지만 실제 게임이나 엔진에서는 이 파이프라인을 단 한 번만 돌려서 화면을 완성하지 않는다.
현대 렌더링에서는 보통,
- 그림자 먼저 그리고
- 불투명 오브젝트 그리고
- 반투명 오브젝트 그리고
- 후처리(Post Process)를 여러 번 적용해서
여러 번 나눠서 렌더링한다.
이렇게 “어떤 목적을 가지고, 특정 렌더 타겟에, 특정 순서로 그리는 한 묶음”을 Render Pass라고 부른다.
Render Pass는 쉽게 말해 GPU에게 내리는 하나의 렌더링 작업 묶음이다. 각 Render Pass는 보통 다음 정보를 함께 가진다.
- 무엇을 그릴지 (메시, 머티리얼)
- 어디에 그릴지 (Render Target, Depth Buffer)
- 어떤 상태로 그릴지 (Depth Test, Blend, Stencil 등)
- 어떤 셰이더를 쓸지
즉, 그래픽 파이프라인 설정 + 드로우 호출들의 묶음이라고 생각하면 된다.
왜 Render Pass로 나누는가?
Render Pass는 목적에 따라 서로 다른 조건으로 GPU를 여러 번 사용하는 작업이다.
그림자를 그릴 때와 불투명 오브젝트를 그릴 때, 후처리를 할 때는
- 사용하는 셰이더도 다르고
- 필요한 버퍼도 다르고
- Depth / Blend / Stencil 설정도 다르다.
이 모든 작업을 하나의 상태로 처리할 수 없기 때문에 렌더링을 의미 단위로 나누어 관리하게 된다.
‘기능’도 ‘패스’라고 할 수 있을까?
여기서 자주 헷갈리는 포인트가 하나 있다. “Bloom도 하나의 기능인데, 이것도 Pass라고 부를 수 있을까?”
결론부터 말하면 상황에 따라 다르다.
기능 자체는 Pass가 아니다. 하지만 그 기능을 구현하기 위해 GPU가 별도의 렌더링 과정을 수행한다면, 그 과정은 Render Pass가 된다.
DirectX에서의 Render Pass Definitions
이 정의를 그대로 풀어보면, Render Pass는 단순히 “드로우 호출의 묶음”이 아니라,
- 어디에 그릴지(Render Target / Depth Buffer)가 고정되어 있고
- 그 대상에 대해 수행되는 GPU 작업들이 하나의 묶음으로 관리되며
- 그 결과를 어떻게 보존하거나 버릴지까지 명시된 단위
라고 이해할 수 있다.
그 중에서도 가장 중요한 기준은 이것이다.
GPU가 그리는 Render Target이 바뀌면, Pass가 바뀐다.
Render Target이 바뀌는 순간,
- 출력 대상이 달라지고
- 메모리 접근 방식이 달라지고
- GPU 상태가 크게 변경된다.
즉, Render Target 변경은 Pass의 경계가 된다.
하지만 편의상 Pass라고 부르는 경우도 있으니 알잘딱깔센(?)하게 알아듣자.