KH_C++
포워드 렌더링(Forward Rendering), 디퍼드 렌더링(Deferred Rendering) 본문
[ Forward Rendering ]
이 방식은 모바일 환경에서 주로 쓰인다. 오브젝트와 동적 라이팅이 적으면 성능 부하도 그만큼 적어진다. 그러나 동적 라이트의 갯수나 동적 라이트에 영향받는 오브젝트가 많아지면 성능 저하가 기하급수적으로 커진다.
포워드 렌더링은 포워드 라이팅, 포워드 쉐이딩이라고도 부르는데, 사실 디퍼드 이전에 사용되던 전통적인 오브젝트 렌더링 기법이다.
포워드 렌더링은 오브젝트들을 픽셀화 하여 각 픽셀마다 쉐이딩과 라이팅 연산을 더하는 방식으로 렌더링이 진행된다.
포워드 렌더링은 일반적으로 디퍼드 렌더링보다 더 나은 퍼포먼스를 보일 수 있으며 디퍼드 렌더링보다 더 나은 안티에일리어싱을 기대할 수 있다.
Forward Rendering과정
Vertex Generation -> Vertex Processing -> Primitive Generation -> Primitive Processing -> Rasterization(Fragment Generation) -> Fragment Processing -> Frame-Buffer Ops -> Frame Buffer
3D 공간에 존재하는 폴리곤을 픽셀화하고 그 픽셀마다 쉐이딩과 라이팅 연산을 더하는 방식
각 Mesh에 대하여 각 광원에 관한 것을 모두 그려야함.
장점
- 저사양에서도 잘 구현가능
- 반투명처리 가능
- 해상도가 올라가도 요구하는 메모리가 적음
- Single-pass, multi-light
문제점
- 화면에 렌더링되지 않아도 되는 면도 쉐이딩 연산
- 해당 라이트에 영향을 받지 않아도 라이트를 연산
- 라이팅 증가에 따른 계산의 복잡성이 증가하여 라이트 사용 개수의 한계가 있음.
예시) n개의 오브젝트, m개의 라이트
라이트 연산량 n x m --> 라이트가 많을수록 연산량 증가하고 느림.
- Multi-pass, multi-light
문제점
- 화면에 렌더링 되지 않을 면도 쉐이딩 연산
- 높은 배치 카운트
- 각 패스마다 중복된 작업 많음
ex) n개의 오브젝트, m개의 라이트
라이트 연산량 m * 라이트의 영향을 받는 오브젝트의 개수
[ Deferred Rendering ]
디퍼드 랜더링은 많은 수의 동적 라이트를 괜찮은 성능으로 처리할 수 있다. 따라서 PC 및 콘솔 게임에서 널리 쓰인다.
그러나 기기의 성능이 어느 정도 받쳐주어야 하며, 한 번에 여러 개의 버퍼에 한꺼번에 렌더링 하는 멀티 렌더 타겟 기능이 필요하다.
멀티 렌더 타겟을 이용해서 여러 개의 지오메트리 버퍼(G버퍼)에 불투명(Opaque)한 오브젝트들의 정보를 렌더링한다. 이때 버퍼에는 다양한 정보가 기록되고, 모든 오브젝트들을 버퍼에 렌더링 한 후 이 정보들을 토대로 라이팅을 처리한다. 최종적으로 프레임 버퍼에 이를 출력하여 씬의 렌더링이 완성된다. 이를 위해 디퍼드 렌더링은 G버퍼에 오브젝트들을 렌더링하는 지오메트리 패스와 라잉을 처리하는 라이트 패스가 분리되어 있다.
이렇게 픽셀정보를 메모리에 저장하기 때문에 유연성이 높고 다양한 렌더링 기능(특수효과)를 쓸 수 있다는 장점이 있다.
그러나, 투명 오브젝트를 처리할 수 없고 후처리가 어렵기 때문에 이를 위해 포워드 패스와 포스트 프로세싱 패스 등이 더 존재한다. (어쨋든 이것저것 섞어서 처리할 수는 있다는 말)
반면 비싼 쉐이딩 연산으로 화면에 보이는 픽셀만 처리하기 때문에 불필요한 쉐이딩 연산을 줄일 수 있고, 여러 실시간 라이트들로 인한 드로우콜에 대한 부담을 줄일 수 있다는 장점이 있다. (어쨋든 빠르다는 말)
이렇게 씬이 바로 렌더링 되는 것이 아니라 여러 과정을 거치면서 지연되기 때문에 Deffered(지연된)라는 이름이 붙었다.
그러나 이런 방식은 메모리 대역폭이 뒷받침 되어야 하는데 모바일 디바이스에서는 아직 좀 그렇다. 그래서 모바일 디바이스에서는 다음에 다룰 포워드 렌더링을 주로 사용한다. (고해상도 모니터를 사용할 때도 이런 문제 발생)
Deferred Rendering과정
Vertex Generation -> Vertex Processing -> Primitive Generation -> Primitive Processing -> Rasterization(Fragment Generation) -> Geometry pass-through -> Frame-Buffer Ops -> G-buffer -> Shading -> Frame buffer
폴리곤을 픽셀화하여 Geometry에 대한 정보와 Lighting에 대한 정보를 나누어 저장하고 렌더링하는 방식
(라이팅 계산을 먼저 하지 않고, 미루어 두었다가 실행하기 때문에 지연(Deferred) 쉐이딩이라고 부름)
Geometry property---> G-Buffer <--- Lighting property G-Buffer에 정보를 모음
G-Buffer (Geometry Buffer)
- Geometry-Pass
- 3D 공간의 Geometry 데이터의 속성값을 들을 G-Buffer에 렌더링하는 단계
- 라이팅 연산은 하지 않음
- MRT(Multi Render Target)을 사용하여 한 패스에 4개 렌더타겟의 정보를 렌더링 (Depth, Normal, Diffuse/Specular)
- Lighting-Pass
- 라이팅을 Geometry 형태로 렌더링을 함
(Point Light = Sphere , Spot Light = Cone , Sun = Full Screen Quad)
- 라이팅에 영향을 받는 픽셀을 찾아내 체크
장점
- 배치가 간단해지고, 엔진에서 관리가 쉬움
- 일반적인 그림자 테크닉과 통합이 쉬움
- 라이팅을 위한 계산이 완전한 0,1 복잡도를 가짐
- 수많은 작은 동적 라이팅 사용이 가능
예시) n개의 오브젝트, m개의 라이트
라이트 연산량 m * 라이트의 영향받는 픽셀 개수
문제점
- 2D 스크린 상에서 처리되어 MSAA(Anti Aliasing) 지원 불가
- G-Buffer가 각 픽셀에 대해 '단일세트데이터'를 저장하여 알파값을 적용 불가능
- 반투명 불가능 (별도의 Forward Rendering 처리)
차이점은 Forward Rendering은 렌더링 한번에 모두 처리, Deferred Rendering은 여러번의 렌더링을 거치며 처리
출처:
https://tsyang.tistory.com/118
https://strange-cpp.tistory.com/64
'공부' 카테고리의 다른 글
GPGPU, 컴퓨트 쉐이더(Compute Shader) (0) | 2023.07.12 |
---|---|
키 프레임 애니메이션(Key frame Animation) (0) | 2023.06.29 |
그림자 매핑(Shadow Mapping) (0) | 2023.06.26 |
노멀 매핑(Normal Mapping), 탄젠트 스페이스(Tangent Space) (0) | 2023.06.26 |
스키닝(Skinning) (0) | 2023.06.23 |