3D Rendering
Forward vs Deferred
Keisa
2024. 12. 17. 11:09
1. Forward 렌더링: 객체 단위로 조명 연산
Forward 렌더링에서는 각 **객체(Object)**를 그릴 때마다 해당 픽셀에 영향을 주는 모든 조명을 한 번에 계산합니다. 즉:
- 각 오브젝트(메시)를 Draw Call 단위로 그립니다.
- 각 픽셀에서 모든 조명을 계산합니다. (여러 조명이 있는 경우, 각 픽셀에서 반복적으로 조명 연산이 발생)
조명 연산 갯수의 증가 이유
Forward 렌더링은 객체 단위로 조명을 처리하기 때문에 다음과 같은 문제가 발생합니다:
- 여러 조명이 하나의 객체에 동시에 영향을 미치는 경우, 각 픽셀마다 조명 계산이 중첩됩니다.
- 조명의 수가 증가하면 라이팅 연산이 선형적으로 증가합니다.
- 화면에 보이지 않는 픽셀까지도 조명 연산이 수행될 수 있어 낭비가 심합니다.
Forward 렌더링의 라이팅 연산 공식
코드 복사
조명 연산 수 = 오브젝트의 픽셀 수 × 영향을 주는 조명 수
예를 들어:
- 오브젝트 A에 1000개의 픽셀이 있고, 5개의 조명이 영향을 준다면 → 1000 × 5 = 5000번의 조명 연산이 발생합니다.
여러 오브젝트가 있다면 각 오브젝트마다 중첩된 조명 연산이 추가로 발생합니다.
2. Deferred 렌더링: 화면 단위로 조명 연산
Deferred 렌더링에서는 모든 지오메트리(오브젝트)를 한 번만 렌더링하여 픽셀 정보를 G-Buffer에 저장한 후, Lighting Pass 단계에서 화면 단위(Screen-Space)로 조명을 계산합니다.
- Geometry Pass: 모든 오브젝트를 렌더링하고 픽셀 정보를 G-Buffer에 저장합니다.
- Lighting Pass: G-Buffer에 기록된 픽셀 정보에 기반하여 화면에 보이는 픽셀만 조명 연산을 수행합니다.
조명 연산 갯수가 줄어드는 이유
- 조명 연산이 **화면 단위(Screen-Space)**에서만 수행되므로, 실제로 보이는 픽셀에만 조명이 계산됩니다.
- 하나의 픽셀에 영향을 주는 조명만 계산하므로, 조명 연산이 중복되지 않습니다.
- Geometry Pass와 Lighting Pass를 분리하여, 오브젝트를 중복해서 그릴 필요가 없습니다.
Deferred 렌더링의 라이팅 연산 공식
코드 복사
조명 연산 수 = 화면에 보이는 픽셀 수 × 해당 픽셀에 영향을 주는 조명 수
예를 들어:
- 화면에 **1920x1080 (약 2백만 픽셀)**이 있고, 각 픽셀당 최대 3개의 조명이 영향을 준다면 → 2,000,000 × 3 = 6백만 번의 조명 연산이 발생합니다.
- 중복 계산이 발생하지 않으므로, 많은 조명이 있어도 효율적입니다.
Forward vs Deferred의 차이 요약
특징Forward 렌더링Deferred 렌더링
조명 계산 단위 | 오브젝트 단위로 조명 계산 | 화면 단위(Screen-Space)로 조명 계산 |
조명 중복 | 하나의 픽셀이 여러 번 중복 계산될 수 있음 | 중복 없이 화면 픽셀에 대해서만 계산 |
낭비 | 보이지 않는 픽셀도 조명 연산 수행 | 보이는 픽셀에 대해서만 조명 연산 수행 |
조명 수 증가 시 성능 | 조명 수가 많아질수록 성능이 급격히 저하됨 | 조명 수가 많아져도 선형적으로 성능 저하 |
메모리 사용량 | 적은 메모리 사용 | G-Buffer로 인해 메모리 사용량 증가 |
결론
Forward 렌더링은 오브젝트 단위로 조명을 계산하므로 조명이 많을수록 중복 연산이 많이 발생합니다. 반면, Deferred 렌더링은 화면에 보이는 픽셀 단위로 조명을 계산하기 때문에 중복 연산이 줄어들어 조명 수가 증가해도 효율적으로 처리됩니다.
하지만 Deferred 렌더링은 G-Buffer를 사용하기 때문에 메모리와 대역폭 사용량이 늘어나는 단점이 존재합니다.