포워드 셰이딩(forward shading) 이 드로 타임에서 지오메트리와 라이팅을 처리하는 동안, 디퍼드 셰이딩(deferred shading) 은 지오메트리와 라이팅을 두 개의 별도 패스로 분리합니다. 따라서 라이팅 계산이 지오메트리 계산과 분리되며, 머티리얼과 고급 라이팅 기능을 보다 효율적으로 구현할 수 있습니다.
모바일 디퍼드 셰이딩 모델(mobile deferred shading model) 또한 이러한 이점이 있을 뿐만 아니라, 타일 기반 GPU를 활용하여 시스템 메모리와 CPU에 대한 퍼포먼스 영향을 줄여줍니다. 덕분에 타일 메모리를 지원하는 모바일 디바이스의 경우 렌더링 퀄리티와 퍼포먼스가 더 뛰어납니다.
이 페이지에서는 다음과 같은 정보를 제공합니다.
-
모바일 디퍼드 셰이딩의 개괄적인 이점과 제한사항
-
모바일 디퍼드 셰이딩 모델과 호환되는 기기
-
프로젝트의 모바일 디퍼드 셰이딩 환경설정 방법
모바일 디퍼드 셰이딩 모드 활성화 방법
모바일 디퍼드 셰이딩을 활성화하는 방법은 다음과 같습니다.
-
프로젝트 세팅(Project Settings) 을 엽니다.
-
엔진 - 렌더링(Engine - Rendering) > 모바일(Mobile) 로 이동합니다.
-
모바일 셰이딩(Mobile Shading) 드롭다운을 클릭하여 디퍼드 셰이딩(Deferred Shading) 으로 설정한 다음 에디터를 재시작합니다.
모바일 디바이스용 프로젝트를 제작하는 경우 모바일 디퍼드 셰이딩 모델을 사용하게 됩니다.
개요
디퍼드 셰이딩은 렌더링 프로세스를 두 가지 패스로 분리합니다.
-
지오메트리 패스(geometry pass) 는 베이스 컬러(BaseColor), 메탈릭(Metallic), 러프니스(Roughness) 파라미터를 처리하여 흔히 G 버퍼 라고 부르는 임시 버퍼에 저장합니다.
-
라이팅 패스(lighting pass) 는 G 버퍼에서 읽어온 머티리얼 어트리뷰트에 대해 라이팅을 계산한 다음, 셰이딩된 픽셀을 프레임 버퍼에 작성합니다.
반면 포워드 셰이딩은 드로 타임에서 라이트 및 섀도와의 머티리얼 상호작용을 계산합니다. 즉, 머티리얼에는 다른 모든 파라미터와 함께 라이트 및 섀도 코드가 포함되어 있어야 합니다. 디퍼드 셰이딩은 이 정보를 생략하고 단순한 셰이더와 머티리얼을 사용할 수 있기 때문에 컴파일에 소요되는 시간이 짧습니다.
디퍼드 셰이딩은 섀도 및 리플렉션 텍스처를 바인딩할 필요가 없기 때문에 각 드로 콜의 그래픽 상태에 대해서도 많은 관리가 필요하지 않아 CPU 퍼포먼스도 더 높습니다. 즉, 렌더 하드웨어 인터페이스(Render Hardware Interface, RHI) 스레드의 작업량이 줄어들어 다른 스레드에 큰 코어를 사용할 수 있으므로 가용 스레드끼리 상충하는 경우도 적습니다.
디퍼드 셰이딩을 사용하면 라이팅 프로세싱 및 메모리 비용이 지오메트리 렌더링 비용과 분리되므로 라이팅을 한층 유연하게 디버깅하고 최적화할 수 있습니다.
모바일 디퍼드 셰이딩
모바일 디퍼드 셰이딩 모델은 모바일 디바이스에서 디퍼드 셰이딩을 효율적으로 수행하기 위해 GPU 내부의 타일 메모리에 G 버퍼를 넣습니다. 즉, G 버퍼는 시스템 메모리에 저장되지 않습니다. 디바이스가 LAZILY_ALLOCATED
메모리 타입을 지원하는 경우에도 메모리를 할당하지 않습니다. 메모리가 없는 렌더 타깃을 지원하는 디바이스에 모바일 디퍼드 셰이딩을 적용하면 메모리를 덜 사용하지만, 그렇지 않은 디바이스의 경우 G 버퍼에 시스템 메모리를 할당하므로 메모리 사용량이 약간 더 많습니다.
퍼포먼스 향상 예시
아래 머티리얼은 단순한 컬러와 러프니스 입력을 사용합니다. 모바일 포워드 렌더링을 적용하면 인스트럭션 147개와 샘플러 2개가 사용됩니다. 모바일 디퍼드를 적용하면 라이팅과 셰이딩 인스트럭션을 포함할 필요가 없으므로 인스트럭션 34개만 사용되며 샘플러는 사용되지 않습니다. 따라서 프레임레이트 멈춤 현상도 줄어들고, 메모리 사용량도 전반적으로 줄어듭니다.

왼쪽: 단순한 컬러와 러프니스 입력을 사용하는 기본 머티리얼. 우측 상단: 모바일 포워드를 적용한 머티리얼 통계. 우측 하단: 모바일 포워드를 적용한 머티리얼 통계.
모바일 디퍼드 셰이딩과 모바일 포워드 셰이딩의 사용 가이드라인
다음과 같은 경우에는 모바일 디퍼드 셰이딩을 추천합니다.
- 타깃 디바이스가 타일 기반 모바일 GPU를 사용하는 경우
- 게임에서 사전 계산된 라이팅을 사용하지 않는 경우
- 포워드 셰이딩이 지원하지 않는 고급 라이팅 기능이 필요한 경우
- 복잡한 라이팅을 구현하기 위해 퍼포먼스를 높이고 메모리를 절약해야 하는 경우
위와 같은 특징이 있는 프로젝트의 전형적인 예시로는 대규모 야외 환경을 갖추고 있고 다이내믹 라이팅에 크게 의존하는 게임이 있습니다. 언리얼 엔진에서 지원되는 대부분의 디바이스는 디퍼드 셰이딩의 하드웨어 요구사항을 충족하며, 디퍼드 셰이딩은 퍼포먼스 측면에서 상당한 이점을 가지고 있습니다. 따라서 대부분의 UE 모바일 프로젝트에는 모바일 디퍼드 셰이딩 사용을 권장합니다. 그러나 주로 사전 계산된 라이팅을 사용한다면 포워드 셰이딩 모델이 적합합니다. 포워드 셰이딩은 로컬 라이트나 다수의 리플렉션 캡처를 사용할 때 유리합니다.
모바일 디퍼드 셰이딩에서 지원되는 렌더링 기능
이 섹션에는 모바일 포워드 셰이딩 모드에서 사용할 수 없는 모바일 디퍼드 셰이딩 모드만의 렌더링 기능을 나와 있습니다.
라이팅 기능
모바일 디퍼드 셰이딩 모드는 다음과 같은 라이팅 기능을 제공합니다.
- 라이트 함수
- 라이트 프로파일
- IES 라이트 프로파일
-
릿 데칼
- 높은 로컬 라이트 렌더링 효율
렌더링 제한사항
사전 계산된 라이팅 및 셰이딩 모델의 제한사항
사전 계산된 라이팅을 사용하는 프로젝트의 경우, 디퍼드 셰이딩은 디폴트 라이팅포함 및 라이팅제외 셰이딩 모델만 제공합니다. 사전 계산된 라이팅을 사용하는 프로젝트의 경우 디퍼드 셰이딩이 아닌 포워드 셰이딩 사용을 적극 권장합니다.
반투명 패스
반투명 기능은 디퍼드 셰이딩 모드에서도 사용할 수 있지만, 반투명 패스는 항상 포워드 셰이딩을 사용합니다. 유리, 물 등 반투명 머티리얼의 라이팅 모드(Lighting Mode) 를 표면 포워드 셰이딩(Surface ForwardShading) 으로 설정하시기 바랍니다.
멀티 샘플 안티 에일리어싱(MSAA)
멀티 샘플 안티 에일리어싱(Multi-Sample Anti-Aliasing, MSAA) 은 G 버퍼에 필요한 공간 때문에 디퍼드 렌더링에서 지원되지 않습니다. 각 픽셀이 아닌 각 샘플을 셰이딩해야 하기 때문에 셰이딩 패스도 리소스를 집약적으로 소모하게 됩니다.
릿 데칼 제한사항
디퍼드 모드에서는 릿 데칼(Lit decals) 을 스태틱 라이팅과 함께 사용할 수 없습니다. 데칼에 추가 버퍼가 필요하기 때문입니다. 이 기능은 메모리 제약으로 인해 모바일 기기에서 실행할 수 없습니다. 그러나 이미시브(emissive) 데칼은 스태틱 라이팅과 함께 잘 작동합니다.
기타 데칼 제한사항
G 버퍼의 공간 제약 때문에 데칼은 노멀에 팔면체 인코딩을 사용하여 크기를 줄입니다. 이 인코딩 방식 때문에 G 버퍼에서는 노멀을 블렌딩하거나 수정할 수 없습니다. 그러나 완전히 덮어쓰는 것은 가능합니다.
셰이딩 모델 제한사항
모바일 디퍼드 셰이딩에서 여러 셰이딩 모델을 동시에 지원하는 것은 매우 많은 비용이 듭니다. 따라서 복잡한 셰이딩 모델은 필요한 오브젝트에만 사용할 수 있도록 제한해야 합니다.
디바이스 호환성
언리얼 엔진은 PC 플랫폼, iOS, Android Vulkan, Android GLES 등, 모바일 렌더러를 사용하는 모든 플랫폼에서 모바일 디퍼드 셰이딩을 지원합니다. 다음 섹션에서는 각 디바이스 제품군이 어떻게 타일 메모리를 사용하여 이 셰이딩 모드를 지원하는지 자세히 설명하고, 특정 디바이스의 제한사항을 알아봅니다.
타일 메모리 사용
타일 메모리에서 셰이딩을 수행하는 방식은 모바일 플랫폼마다 다릅니다.
- iOS는
framebuffer_fetch
와 유사한 기능을 사용하여 타일 메모리의 G 버퍼에 액세스합니다. - Android Vulkan은 Vulkan의 서브 패스를 사용합니다.
- Android GLES는 익스텐션을 필요로 하며, 모든 GPU에 적용되는 범용 메서드는 없습니다.
- Mali 및 PowerVR은 PLS 익스텐션을 사용합니다.
- Adreno GPU는
framebuffer_fetch
익스텐션을 사용합니다.
그 밖의 GPU는 즉시 모드 렌더러를 사용하므로 이 타일 메모리 기법이 적용되지 않습니다. 이 경우 G 버퍼가 시스템 메모리에 일반 텍스처로 할당되므로 메모리 절약 효과가 없을 수 있습니다.
하드웨어 제한사항
Android Vulkan을 사용하는 Mali 디바이스는 컬러 및 입력 어태치먼트에 엄격한 제한사항이 존재합니다.
- G 버퍼 픽셀당 16바이트 또는 128비트
- 최대 4개의 입력 어태치먼트만 사용 가능
- 라이팅 패스 도중에는 최대 3개의 컬러 어태치먼트와 1개의 뎁스 어태치먼트만 가져올 수 있음
모든 디바이스에 걸쳐 일관성을 유지하기 위해 모바일 디퍼드 셰이딩 모드에는 기본적으로 이러한 제한사항이 적용됩니다. 제한사항을 없애려면 *Engine.ini
파일의 MobileUsesExtendedGBuffer
파라미터를 true
로 설정하시기 바랍니다. 이렇게 설정하면 모바일 디퍼드 셰이딩 모드가 사용자 디바이스의 모든 기능을 사용할 수 있도록 G 버퍼를 확장합니다.