디퍼드 렌더링, 포워드 렌더링이란? 그리고 차이점에 대해서
디퍼드 렌더링, 포워드 렌더링이란? 그리고 차이점에 대해서
유니티 코리아의 오지현님의 영상을 보고 디퍼드 렌더링과 포워드 렌더링의 기본적인 개념에 대해서 정리한 글입니다.
Forward Rendering
포워드 렌더링은 많은 동적 라이팅을 처리하는데 한계가 있다.
왜냐면 오브젝트의 라이팅 처리 방식 때문인데 오브젝트가 화면에 그려질 때 맵에 존재하는 모든 라이팅들과 연산을 하고 렌더링 된다.
다시 말하면 오브젝트 하나가 그려질 때 그때그때마다 연산을 한다.
라이팅이 10개가 있고, 오브젝트가 10개가 있다면 10 x 10 = 100번의 연산이 필요하다(라이팅만을 위한 계산량).
라이트에 영향을 받지 않는 오브젝트 또한 연산을 하게 된다.
포워드 렌더링에는 멀티패스 방식과 싱글패스 방식이 존재하는데
멀티패스는 위에 언급한 대로 씬에 있는 모든 라이팅과 계산을 하는 방식이다 이 때문에 라이팅이 많아질 경우 성능이 굉장히 떨어지게 된다.
영상의 오지현 님의 말로는 멀티패스에서 라이팅을 많이 쓰게 되면 혼날 수 있다고 한다ㅋㅋ
싱글패스 방식은 오브젝트가 계산하는 라이팅의 개수를 제한할 수 있다.
유니티에서 싱글패스는 현재 최대 8개까지의 라이팅만 계산하도록 제한이 가능하다.
Deferred Rendering
디퍼드 렌더링은 라이팅 처리 방식이 포워드 렌더링과 다르다.
오브젝트 하나하나가 렌더링 시 라이팅 계산을 하는 포워드 렌더링과는 다르게,
디퍼드 렌더링은 G-buffer(Geometry-buffer)라는 곳에 diffuse, depth, normal map 등 라이팅에 계산에 필요한 속성들을 저장한다. 그리고 오브젝트를 최종 렌더링 시 이 G-buffer의 정보를 가져와 그린다.
이 말이 무슨 말인지 조금 더 자세히 설명을 하자면
파이프라인을 거친 오브젝트를 라이팅 계산 전에 라이팅 계산이 필요한 속성들을 G-buffer에 담는다.
예를 들면 오브젝트의 Albedo, Specular, Normal, lighting, depth 값들이 G-buffer에 들어간다
G-buffer에는 해당 값들을 각각 저장하는 버퍼가 있다.
이 과정을 모든 오브젝트가 수행하고 나서 라이팅 연산을 수행한다.
이 때문에 오브젝트가 얼마나 존재하던 라이팅 연산은 딱 1번만 수행한다.
그리고 이 연산은 일종의 포스트 프로세싱처럼 픽셀에서 라이팅 계산이 수행되는데
해당 픽셀을 그릴 때 각각의 G-buffer에서 해당 픽셀의 정보를 가져온다.
Albedo버퍼의 해당 픽셀 정보,
Specular버퍼의 해당 픽셀 정보,
depth버퍼의 해당 픽셀 정보
이 들을 전부 가져와 라이팅 연산을 하고 해당 픽셀을 그린다.
이렇게 하기에 라이팅 연산은 딱 1번이며 라이팅 영향을 받지 않는 오브젝트까지 연산을 하거나 할 필요도 없다.
그렇지만 G-buffer에 여러 속성 값들을 동시에 저장해 야하기에 메모리 대역폭에 대한 이슈가 있다.
이 때문에 모바일에서는 사용하기는 어려운데 영상 뒷부분에 이를 극복한 새로운 기술에 대한 이야기가 있는듯하다.
영상이 길어서 잘라서 보고 있는데 뒷부분까지 보게 되면 다시 정리를 해봐야겠다.
https://www.youtube.com/watch?v=anz5bHVbeEY
https://www.slideshare.net/agebreak/ndc11-deferred-shading