렌더 파이프라인
고친 사람 github-actions[bot]
렌더 파이프라인은 게임 화면 한 장을 그리는 일을 어떤 차례로 할지 정합니다. 게임 엔진은 화면을 새로 그릴 때마다 이 차례를 처음부터 다시 밟습니다. 그래픽 카드 안의 처리 단계를 같은 이름으로 부르기도 합니다. 이 항목은 엔진이 짜는 차례를 다룹니다.
쉽고 빠른 이해
렌더 파이프라인은 화면 한 장을 그리는 작업 순서표입니다. 그림자를 먼저 그려 둡니다. 그 그림자를 써서 물체를 그립니다. 다 그린 그림에는 흐림 같은 효과를 입힙니다.
순서가 틀리면 그림이 틀립니다. 그림자를 물체보다 늦게 그리면 물체를 칠할 때 쓸 그림자가 없습니다. 비치는 유리를 뒤의 벽보다 먼저 그리면 유리 너머로 벽이 안 보입니다.
- 화면에 안 보일 물체를 먼저 걸러 냅니다
- 그림자, 불투명한 물체, 비치는 물체 순서로 그립니다
- 다 그린 그림 전체에 효과를 입힌 뒤 점수판 같은 화면 글자를 얹습니다
대가는 시간입니다. 모든 단계가 화면 한 장마다 다시 돕니다. 단계를 늘릴수록 1초에 그릴 수 있는 화면 수가 줄어듭니다.
빛을 언제 계산하느냐에 따라 순서표의 모양이 둘로 갈립니다. 물체를 그리면서 바로 계산하는 방식과 다 그린 뒤 화면에 남은 점만 계산하는 방식입니다. 엔진은 게임이 돌 기기에 맞춰 둘 중 하나를 고릅니다.
상세
토스트 가게는 주문 한 건이 들어올 때마다 같은 순서를 처음부터 밟습니다. 먼저 빵을 굽습니다. 구운 빵에 달걀과 채소를 얹습니다. 다 얹으면 종이에 싸서 내놓습니다.
앞에서 만든 것을 뒤에서 쓰니 순서를 바꿀 수 없습니다. 다음 주문이 들어오면 다시 빵 굽기부터 시작합니다.
렌더 파이프라인이 이 조리 순서입니다. 주문 한 건이 화면 한 장입니다. 구운 빵처럼 앞 단계가 만들어 뒤 단계가 쓰는 것이 그림자 같은 중간 결과입니다.
화면 한 장을 그리는 일
게임 화면은 멈춘 그림 여러 장을 빠르게 갈아 끼워서 움직이는 것처럼 보입니다. 이 그림 한 장을 프레임이라고 부릅니다. 게임은 대개 1초에 수십 장을 새로 그립니다.
그림을 칠하는 일은 GPU(Graphics Processing Unit, 그래픽 처리 장치)가 맡습니다. GPU 는 화면의 점 수백만 개를 한꺼번에 칠하도록 만든 칩입니다. CPU(Central Processing Unit, 중앙 처리 장치)는 무엇을 어떻게 그릴지 정해 GPU 에 명령으로 넘깁니다.
「이 물체를 그려라」는 명령 하나를 드로우 콜이라고 부릅니다. 물체 하나를 그리는 데 대개 한 번씩 부릅니다. 물체가 놓인 게임 속 세계를 장면이라 합니다. 장면에 물체가 천 개 있으면 드로우 콜도 그만큼 쌓입니다.
렌더 파이프라인은 이 명령들을 어떤 묶음으로 나눠 어떤 차례로 보낼지 정하는 틀입니다. 이 틀은 게임 엔진이 들고 있습니다. 게임을 만드는 사람은 틀 안에 물체와 재질을 채웁니다.
그래픽스 파이프라인과 가르기
이름이 비슷한 그래픽스 파이프라인이 있습니다. 드로우 콜 하나가 GPU 안에서 지나는 단계입니다. 이 단계는 GPU 가 정해 둔 것이라 엔진이 순서를 바꾸지 못합니다.
화면 속 물체는 작은 삼각형 수천 개로 이루어져 있습니다. GPU 는 먼저 삼각형의 꼭짓점이 화면 어디에 오는지 계산합니다. 다음으로 삼각형이 덮는 점을 찾습니다. 마지막으로 점마다 색을 칠합니다.
렌더 파이프라인은 그보다 한 층 위에 있습니다. 화면 한 장을 그리는 동안 드로우 콜 수천 번을 어떻게 묶고 줄 세울지 정합니다. 그렇게 보낸 드로우 콜 하나하나가 그래픽스 파이프라인을 처음부터 끝까지 지납니다.
렌더 파이프라인을 이루는 단계 하나를 렌더 패스라고 부릅니다. 장면을 한 차례 그려 이미지 한 장을 내놓는 단계입니다. 그림자를 그리는 패스, 물체를 그리는 패스처럼 하는 일에 따라 이름을 붙입니다.
flowchart TD
subgraph RP["렌더 파이프라인 · 엔진이 짜는 차례"]
A["그림자 그리기 패스"] --> B["물체 그리기 패스"] --> C["효과 입히기 패스"]
end
subgraph GP["그래픽스 파이프라인 · GPU 안의 단계"]
D["꼭짓점 위치 계산"] --> E["덮는 점 찾기"] --> F["점마다 색 칠하기"]
end
RP -->|"어느 패스든 드로우 콜마다 한 번씩"| GP
위 칸의 패스는 어느 것이든 드로우 콜 여러 번으로 이루어집니다. 드로우 콜마다 아래 칸의 세 단계를 한 번씩 지납니다. 두 이름을 섞어 쓰는 글이 많습니다. 「파이프라인」이 나오면 어느 층 이야기인지 앞뒤를 보고 가려야 합니다.
그릴 물체 고르기
첫 단계는 그릴 물체를 고르는 일입니다. 카메라 뒤에 있거나 다른 물체에 완전히 가려진 물체는 그려도 화면에 안 나옵니다. 이런 물체를 미리 빼는 일이 컬링입니다.
컬링이 맨 앞에 오는 까닭은 뒤의 모든 단계가 이 목록을 쓰기 때문입니다. 여기서 한 물체를 빼면 그림자 패스와 물체 패스에서 그 물체의 드로우 콜이 함께 사라집니다.
같은 단계에서 남은 물체를 줄 세웁니다. 불투명한 물체는 카메라에 가까운 것부터, 비치는 물체는 먼 것부터 세웁니다. 까닭은 아래 두 단계가 설명합니다.
그림자 미리 그리기
그림자를 그리려면 어느 점에 빛이 닿지 않는지 알아야 합니다. 빛이 있는 곳에 카메라를 하나 더 둡니다. 그 카메라로 장면을 먼저 그립니다. 이렇게 그림자를 구하는 방법이 그림자 매핑입니다.
이 패스는 색을 칠하지 않습니다. 빛에서 바라본 방향마다 빛에서 가장 가까운 표면까지의 거리만 이미지에 적어 둡니다. 이 이미지가 그림자 맵입니다.
물체를 그릴 때 점마다 빛까지의 거리를 그림자 맵에 적힌 거리와 견줍니다. 그림자 맵의 값보다 멀면 빛과 그 점 사이에 더 가까운 표면이 끼어 있다는 뜻입니다. 그 점은 그림자로 칠합니다. 이 비교를 하려면 그림자 맵이 먼저 완성돼 있어야 합니다.
불투명한 물체 그리기
불투명한 물체는 가까운 것부터 그립니다. 이때 깊이 버퍼를 씁니다. 화면의 점마다 지금까지 칠한 것이 카메라에서 얼마나 먼지를 적어 두는 이미지입니다.
새로 칠하려는 점이 깊이 버퍼의 값보다 멀면 이미 앞에 무언가가 있다는 뜻입니다. 그 점은 칠하지 않고 버립니다. 이 비교가 깊이 테스트입니다.
가까운 것부터 그리면 뒤에 오는 물체의 점 대부분이 깊이 테스트에서 버려집니다. 어차피 가려질 점에 색을 계산하는 낭비가 줄어듭니다.
비치는 물체 그리기
유리나 연기는 뒤가 비쳐 보여야 합니다. 새 색을 칠할 때 그 점에 이미 있던 색과 섞습니다. 이 섞는 처리가 블렌딩입니다.
섞으려면 뒤에 있는 색이 먼저 칠해져 있어야 합니다. 그래서 비치는 물체는 불투명한 물체를 다 그린 다음에 그립니다. 비치는 물체끼리도 먼 것부터 그려야 겹친 유리 여러 장이 바르게 섞입니다.
효과 입히고 화면 글자 얹기
지금까지 그린 그림은 화면에 바로 내보내지 않고 이미지 한 장에 받아 둡니다. 이렇게 그림을 받는 이미지를 렌더 타깃이라고 부릅니다. 받아 두어야 그 그림 전체를 다시 읽고 손볼 수 있습니다.
다 그린 그림 전체에 흐림이나 밝기 보정을 거는 단계가 후처리입니다. 밝은 불빛 둘레가 번져 보이게 하거나 화면 전체의 색감을 바꾸는 일이 여기 속합니다.
점수판과 메뉴 같은 화면 글자는 맨 마지막에 얹습니다. 후처리보다 먼저 그리면 글자까지 흐려지거나 색이 바뀝니다.
단계마다 무엇을 읽고 무엇을 내놓는지 모으면 순서가 왜 이런지 한눈에 보입니다. 뒤 단계가 읽는 것은 앞 단계가 내놓은 것입니다.
| 단계 | 읽는 것 | 내놓는 것 |
|---|---|---|
| 그릴 물체 고르기 | 장면의 물체 전부 | 그릴 물체 목록 |
| 그림자 미리 그리기 | 물체 목록 | 그림자 맵 |
| 불투명한 물체 그리기 | 물체 목록 · 그림자 맵 | 그림 · 깊이 버퍼 |
| 비치는 물체 그리기 | 물체 목록 · 그림 · 깊이 버퍼 | 섞인 그림 |
| 후처리 | 섞인 그림 | 효과를 입힌 그림 |
| 화면 글자 얹기 | 효과를 입힌 그림 | 화면에 나갈 그림 |
빛을 계산하는 두 방식
물체를 그리는 단계에서 시간이 가장 많이 드는 일은 빛 계산입니다. 점마다 어느 빛이 얼마나 닿는지 따져 색을 정합니다. 이 일을 셰이딩(shading)이라고 합니다. 빛이 여럿이면 그만큼 계산이 불어납니다.
빛 계산을 언제 하느냐에 따라 렌더 파이프라인의 모양이 둘로 갈립니다. 엔진이 고르는 가장 큰 갈림길이 이것입니다.
첫째는 포워드 렌더링(forward rendering)입니다. 물체를 그리면서 그 물체의 점마다 빛을 전부 계산합니다. 짜임이 단순합니다. 비치는 물체도 같은 방식으로 그립니다.
포워드 렌더링은 빛이 많을 때 무거워집니다. 물체마다 모든 빛을 따지므로 일이 물체 수와 빛 수를 곱한 만큼 늘어납니다. 나중에 가려져 버려질 점까지 빛을 계산하기도 합니다.
둘째는 지연 셰이딩(deferred shading)입니다. 이름처럼 셰이딩을 뒤로 미룹니다. 먼저 불투명한 물체를 전부 그립니다. 이때 빛은 계산하지 않습니다.
대신 점마다 빛 계산에 쓸 값만 적어 둡니다. 그 점의 색 · 표면이 향하는 방향 · 카메라에서의 거리 같은 값입니다. 이 값을 담는 이미지 여러 장의 묶음이 G-버퍼(geometry buffer)입니다.
물체를 다 그린 뒤 빛마다 G-버퍼를 읽어 화면의 점 단위로 색을 계산합니다. 깊이 테스트를 거쳤으니 G-버퍼에는 화면에 남을 점만 적혀 있습니다. 가려진 점은 빛 계산을 받지 않습니다.
지연 셰이딩은 메모리를 많이 씁니다. 화면 크기의 이미지를 여러 장 채웁니다. 빛을 계산할 때 그 이미지를 다시 읽습니다.
비치는 물체는 이 방식으로 그리지 못합니다. G-버퍼에는 점 하나에 표면 하나의 값만 적힙니다. 유리와 그 뒤의 벽을 함께 담을 수 없으니 둘을 섞지 못합니다. 비치는 물체는 따로 포워드 방식으로 그립니다.
두 방식은 빛을 어느 점에 계산하느냐에서 갈립니다. 포워드는 나중에 가려질 점까지 계산합니다. 지연은 화면에 남은 점만 계산하는 대신 메모리를 더 씁니다.
| 포워드 렌더링 | 지연 셰이딩 | |
|---|---|---|
| 빛을 계산하는 때 | 물체를 그리면서 | 물체를 다 그린 뒤 |
| 빛을 계산하는 점 | 나중에 가려질 점까지 | 화면에 남은 점만 |
| 비치는 물체 | 같은 방식으로 그린다 | 포워드 방식으로 따로 그린다 |
| 메모리 | 적게 쓴다 | 화면 크기 이미지 여러 장을 쓴다 |
엔진이 파이프라인을 골라 끼우게 하는 까닭
어느 모양이 맞는지는 기기와 게임이 정합니다. 휴대폰의 GPU 는 대개 메모리를 오가는 비용이 큽니다. G-버퍼처럼 큰 이미지를 여러 장 쓰는 방식이 부담스러워 포워드 쪽을 고르는 일이 많습니다.
빛이 많은 장면을 고사양 PC 에서 돌리는 게임은 지연 셰이딩 쪽이 유리할 수 있습니다. 빛이 늘어도 가려질 점에는 빛을 계산하지 않기 때문입니다.
그래서 어떤 게임 엔진은 렌더 파이프라인을 골라 끼우게 합니다. 휴대폰까지 겨냥한 파이프라인과 고사양 PC 를 겨냥한 파이프라인을 따로 내놓기도 합니다. 단계를 코드로 직접 짜게 하는 엔진도 있습니다.
단계가 많아지면 어느 단계가 어느 이미지를 쓰고 읽는지 따지기가 어려워집니다. 어떤 엔진은 단계와 이미지 사이의 관계를 그래프로 적어 두게 합니다. 순서는 엔진이 그 그래프를 보고 정합니다. 이 구조가 렌더 그래프입니다.
정해진 시간 안에 끝내기
1초에 60장을 그리려면 한 장에 쓸 수 있는 시간은 60분의 1초입니다. 한 장에 주어진 이 시간을 프레임 예산이라고 부릅니다. 렌더 파이프라인의 모든 단계가 이 안에 끝나야 합니다.
예산을 넘기면 다음 장이 늦게 나와 화면이 끊겨 보입니다. 단계를 하나 더하면 그만큼 예산을 씁니다. 후처리처럼 화면 전체를 읽고 쓰는 단계는 화면이 클수록 오래 걸립니다.
파이프라인을 짜는 일은 무엇을 얻고 무엇을 뺄지 고르는 일입니다. 그림자를 더 곱게 그리면 다른 단계에 쓸 시간이 줄어듭니다. 엔진이 내놓은 기본 파이프라인으로 모자랄 때, 이를테면 빛이 아주 많거나 특정 기기에서 느릴 때 파이프라인을 직접 손봅니다.
관련 항목
렌더 파이프라인이 거치는 처리 단계
컬링 · 프러스텀 컬링 · 오클루전 컬링 · 그림자 매핑 · 깊이 프리패스 · 후처리 · 톤 매핑 · 블룸 · 안티에일리어싱
렌더 파이프라인이 빛을 계산하는 방식
셰이딩 · 포워드 렌더링 · 지연 셰이딩 · 포워드 플러스 렌더링 · 클러스터드 셰이딩 · G-버퍼
렌더 파이프라인이 그리고 읽는 이미지
렌더 타깃 · 프레임버퍼 · 깊이 버퍼 · 그림자 맵 · 스텐실 버퍼 · 텍스처
렌더 파이프라인 아래에서 도는 GPU 쪽 부품
그래픽스 파이프라인 · 렌더 패스 · 드로우 콜 · 셰이더 · 깊이 테스트 · 블렌딩 · GPU
렌더 파이프라인을 짜고 고르게 하는 엔진 기능
게임 엔진 · 렌더 그래프 · Scriptable Render Pipeline · Universal Render Pipeline · High Definition Render Pipeline · 머티리얼
렌더 파이프라인이 맞춰야 하는 시간 지표
프레임 · 프레임률 · 프레임 시간 · 프레임 예산 · GPU 바운드 · 오버드로
렌더 파이프라인이 속하는 상위 분류
렌더 파이프라인과 이름이 겹치는 개념
렌더링 엔진 · 파이프라인 · 컴퓨트 파이프라인 · 레이 트레이싱 파이프라인 · 에셋 파이프라인
다른 이름: render pipeline