Unity

[Unity]Forward, Deferred, Forward+, SSAO

샘김 2022. 11. 18. 09:30

Render pipeline 

렌더 파이프라인은 씬의 콘텐츠를 가져와서 화면에 표시하는 일련의 작업을 수행합니다. 수행하는 작업의 간략한 내용은 다음과 같습니다.

  • Culling
  • Rendering
  • Post Processing

렌더 파이프라인은 저마다 다른 기능 및 성능을 지니고 있으며, 다양한 게임, 어플리케이션 및 플랫폼에 적합합니다.

Unity 가 제공하는 다양한 렌더 파이프라인을 이해해야 개발 초기에 프로젝트에 대한 올바른 경험을 내릴 수 있습니다.

 

Unity 는 다음의 렌더 파이프라인을 제공합니다.

 

 

렌더링이란 3차원 공간에 객체(Object)를 2차원 화면인 하나의 장명(Scene)에 바꾸어 표현하는것을 말한다.

즉 2차원에 표시된 물체처럼 보이게 하는 것이라고 이해하며 쉽다.

 

 

https://parksh86.tistory.com/168

 

렌더링(Rendering) 이란?

렌더링(Rendering) 렌더링이란 3차원 공간에 객체(Object)를 2차원 화면인 하나의 장면(Scene)에 바꾸어 표현하는 것을 말한다. 즉 2차원에 표시된 물체를 3차원에 물체처럼 보이게 하는 것이라고 이해

parksh86.tistory.com

 

Forward Rendering

전통적인 렌더링 기법이며 수많은 동적 Light를 다루는데 에는 한계가 존재합니다. 비교적 저 사양에서 잘 작동하고, 해상도가 올라가도 요구하는 메모리가 Deferred에 비해 적으며 반투명 처리도 문제가 없습니다. 하지만, n개의 광원과 m개의 Mesh가 포함된 Scene을 표현하기 위해서는 n x m 번의 드로우콜이 필요합니다. 그리고 화면에 보이지 않더라도 모든 오브젝트 광원을 계산합니다.

 

Forward Rendering은 오브젝트들을 바로 하나의 버퍼에 그려주기 때문에 각 오브젝트를 그려줄 때 마다 조명 연산을 수행합니다. 광원이 많을수록 드로우 콜의 호출 횟수가 늘어나면서 성능에 큰 부담을 안겨줄 수 있습니다.

 

3D MMORPG로 대성공한 리니지2는 대표적인 Forward Rendering 방식의 게임이다. 당시 게임에서는 특별한 라이팅 처리를 하는것이 어려웠기 때문에 당시 출시된 게임은 화면이 비슷해 보이는 특징이 있다.

 

 

Deferred Rendering

많은 수의 실시간 Lighting 을 좋은 성능으로 처리하기 위한 기술입니다. 필요한 장면을 그린 후 G-Buffer 에 저장하여 장면을 합성하고 최종 결과물을 렌더링 하는 기법입니다. Scene 렌더링과 광원 렌더링을 구분하고 드로우콜이 감소되는 효과가 있고 모바일 GPU에 최적환 된 방법이지만 많은 Render target(Frame Buffer) 을 필요로 합니다.

 

 

Deferred Rending의 연산처럼 각 오브젝트의 Normal 정보와 Depth 정보 Diffuse 정보 등을 모아서 한번에 처리해주는 것을 볼 수 있습니다. MRT(Multi Render Target) 라는 기법으로 각 Render Target에 각각의 정보들을 그려준 뒤 G-Buffer 에 저장하고 하나의 Texture에 연산하여 그려줍니다.

하지만, 메모리 대역폭이 뒷받침 되어야 하며 PC에서 많이 사용하지만 모바일에서는 메모리 대여폭이 낮아 성능이 저하됩니다.

 

* Anti aliasing (MSAA) 해결 과 반투명 오브젝트의 Rendering 이 어렵다.

 

현실감 넘치거나 눈부신 화면을 연출할 때 강력한 효과를 보여주는 Deferred Rendering 현재는 많이 개선되었습니다.

 

 

Forward +

수많은 Lighting  다루는 기술입니다. 여러 개의 타일을 나누고 타일 별로 Lighting 개수를 나눕니다. Forward 의 경우 Lighting 의 영향을 받는 제한이 오브젝트에 있었다면 Forward+ 는 타일 별로 Lighting 의 개수로 영향을 받아 하나의 오브젝트에 여러 개의 Lighting 을 적용시킬 수 있습니다.

 

Forward + Rendering 기술의 첫 번째 단계는 화면 공간에서 균일한 타일 그리드를 사용하여 조명을 타일별 목록으로 분할

두 번째 표준 Forward Rendering pass 를 사용해 Scene 의 개체를 셰이딩 처리하지만, 씬의 모든 동적 조명을 반복해 계산하는 대신 현재 Pixel의 화면 공간 위치를 사용하여 이전패스에서 계산된 그리드의 조명 목록을 조회한다. 이 Light Culling 은 Pixel을 올바르게 조명하기 위해 반복해야 하는 중복 조명의 수를 크게 줄이므로 표준 Forward Rendering 기술에 비해 상당한 성능 향상을 제공하게 된다. Forward + 는 표준 기술을 통합하기 때문에 기존방식으로 구축된 그래픽 엔진에 통합 될 수 있다. Forward + 는 G-Buffer 를 사용하지 않으며 Deferred 의 한계를 겪지 않는다. 불투명 및 투명 지오메트리 모두 Forward +를 사용하여 렌더링할 수 있다. 최신 그래픽 하드웨어를 사용하여 5,000~6,000개의 동적 조명으로 구성된 장면을 Full HD 해상도에서 실시간으로 Rendering 할 수 있게된다. 

 

 

Screen Space Ambient Occlusion (SSAO)

AO(Ambient Occlusion) 빛의 차폐(가려 막고 덮음)로 인한 감쇠 근사치를 구하는 효과입니다.  현실에서도 방의 구석 부분은 훨씬 어둡듯이, 구석이나 틈 같은 곳을 더 어둡게 하여 더욱 자연스럽고 사실적인 느낌을 낼 수 있도록, 표준 글로벌 일루미네이션에 더해 미묘한 효과를 사용하는 것이 가장 좋습니다. 일반적으로 광원과 물체를 던져 놓고 지역 조명으로 처리를 시행하면 그림자는 있지만 실제와 미묘하게 다른데 AO는 이를 보정하고 입체감을 강화하며 실제에 더 가깝게 보이도록 만들어 줍니다.

 

 

SSAO(Screen Space Ambient Occlusion) 가장 많이 쓰이는 AO이며 현재 모니터에 Rendering 되는 영역만을 Screen Space로 인식하여 해당 영역에만 AO를 적용함으로써 일정 수준 최적화 된 그래픽을 제공합니다. 정확도는 떨어지지만 실시간 렌더링에 사용이 가능하면서 연산이 가벼운 이점이 있습니다.

 

위의 사진은 SSAO가 없는 그림이고 아래 사진은 SSAO가 적용된 그림이다. 그림자 층에 따라 좀 더 사물의 형태가 명확하게 보이는 것을 느낄 수 있따. 별다른 텍스처를 사용하지 않고도 포리곤과 셰이더를 이용해서 음영을 사실적으로 표현할 수 있게 해준다.

 

 

 

AO를 표현하는 기법들은 기본적으로 연산이 비쌉니다. 왜냐하면 해당 영여이 표면에 의해서 둘러쌓여있는지 판가름하기 위해서 여러 정보를 수집해야 하기 때문입니다.

 

 

 

 

'Unity' 카테고리의 다른 글

[Unity] UGUI & 최적화  (0) 2023.04.23
[Unity] Occlusion Culling  (0) 2022.12.05