[Graphics] Forward Rendering과 Deferred Rendering
3D 그래픽스에서 조명과 픽셀 색상을 계산하는 서로 다른 렌더링 파이프라인 방식
Forward Rendering
모든 오브젝트를 렌더링할 때 조명 계산을 동시에 수행하는 방식
오브젝트를 그릴 때 픽셀 당 조명 정보를 바로 계산함
특징
- 조명과 쉐이딩이 렌더링 시점에 직접 적용됨
- 각 픽셀에서 사용하는 조명의 수가 제한됨
- 투명 객체 처리에 유리
- 구현이 비교적 단순
장점
- 투명도 처리에 강함
- MSAA같은 전통적 안티 앨리어싱과 잘 작동
- 낮은 수의 조명일 경우 빠름
단점
- 많은 수의 조명이 있을 경우 성능 급락
- 조명이 많은 씬에서 비효율적
Deferred Rendering
렌더링을 두 단계로 나눔
1. G-Buffer에 기하학 정보(법선, 색상, 깊이 등)를 저장
2. 그 후 저장된 정보로 조명 연산을 한 번에 수행
특징
- 조명 계산을 지연(Deferred)시켜서 한 번에 처리
- 모든 픽셀에 대해 조명을 개별 계산
장점
- 수백 개의 조명을 효율적으로 처리 가능
- 복잡한 씬에서 성능이 더 좋을 수 있음
- 동일 픽셀을 한 번만 조명 처리 (불필요한 반복 제거)
단점
- 투명도 처리 복잡 (G-Buffer에 투명 정보 저장하기 어려움)
- MSAA같은 전통적 안티앨리어싱과 호환 어려워서 TAA 같은 거 써야 함
- 메모리 사용량 증가 (G-Buffer)
| 항목 | Forward Rendering | Deferred Rendering |
| 조명 처리 시점 | 오브젝트 렌더링 시 즉시 | 후처리 단계에서 일괄 계산 |
| 성능 (조명 수 적을 때) | 빠름 | 느릴 수 있음 |
| 성능 (조명 수 많을 때) | 매우 느려짐 | 상대적으로 안정적 |
| 투명도 처리 | 쉬움 | 어려움 |
| 구현 난이도 | 쉬움 | 복잡함 |
| 메모리 사용 | 적음 | 많음 (G-buffer 필요) |
| 안티앨리어싱 지원 | 쉬움 (MSAA 사용 가능) | 어려움 (기술 추가 필요) |
모바일 게임, 조명이 적음 -> 포워드
PC, 콘솔 게임 등 조명이 많은 경우 -> 디퍼드
G-Buffer?
Deferred Rendering에서 사용하는 버퍼로
Geometry 혹은 Graphics의 약자
화면에 렌더링되는 기하학적 정보를 저장해두는 버퍼임
| 저장 항목 예시 | 설명 |
| World Position | 픽셀이 3D 공간에서 어디에 있는지 |
| Normal Vector | 표면의 방향 (법선 벡터) |
| Albedo | 표면의 기본 색상 (텍스처 컬러) |
| Specular | 반사 성분 정보 |
| Metallic / Roughness | PBR(Material) 관련 정보 |
| Depth | 픽셀의 깊이값 (z-buffer) |
이 정보들로 이후 조명 계산할 때 화면 상의 모든 픽셀에 대해 한 번만 광원 영향 계산함
*그럼 Z-Buffer는?
픽셀이 얼마나 카메라에 가까운지 판단하기 위해 사용하는 버퍼로 Depth Buffer하고도 함
렌더링 시 각 픽셀이 얼마나 카메라로부터 떨어져있는지 (z값)를 저장하는 2D 버퍼
목적: 오클루전
겹치면 가까운 거 보여주려고 (Depth Test)
Z-Buffer는 투명 객체 처리엔 약함
반투면 오브젝트는 뒷 쪽이 보여야 하기에 별도 처리 필요
일반적으로 투명 오브젝트는 뒤에서부터 그리기 (Back-to-Front Sorting) 사용
* 왜 Deferred Rendering은 투명도 처리가 복잡한가?
G-Buffer가 한 픽셀에 하나의 표면 정보만 저장하기 때문 -> 뒤에 있는 투명한 표면들의 정보는 버려짐
투명도는 여러 표면이 겹쳐 보이는 것이기에 충돌함
* 렌더링 시 계산: 픽셀 색상 = 앞쪽 표면 * 투명도 + 뒤쪽 표면 * (1 - 투명도)
어떻게 해결하는가?
1. 투명 객체만 Forward Rendering으로 따로 처리
- 이때는 Z-Sorting 등을 사용하여 투명도 계산
* Z-Sorting
객체나 픽셀을 깊이 기준으로 정렬하는 기법
2. OIT (Order-Independent Transparency)
- 픽셀마다 여러 레이어 저장
- 리소스 많이 먹음
3. 알파 블렌딩 + Depth Sort
- 투명한 오브젝트를 깊이 순으로 정렬해서 그리기
- 단점: 완전한 정렬이 어렵고 깨질 수 있음