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

왼쪽: 간단한 컬러 및 러프니스 입력을 사용하는 기본 머티리얼입니다. 우측 상단: 모바일 포워드를 사용하는 이 머티리얼의 통계입니다. 우측 하단: 모바일 포워드를 사용하는 이 머티리얼의 통계입니다.
모바일 디퍼드 셰이딩 및 모바일 포워드 셰이딩 사용에 대한 가이드라인
모바일 디퍼드 셰이딩을 사용하면 좋은 경우는 다음과 같습니다.
- 타깃 디바이스가 타일 기반 모바일 GPU를 사용하는 경우
- 게임에 프리컴퓨티드 라이팅이 사용되지 않는 경우
- 포워드 셰이딩에는 없는 고급 라이팅 기능이 필요한 경우
- 복잡한 라이팅을 사용할 때 퍼포먼스를 향상하고 메모리를 절약해야 하는 경우
위의 프로파일에 적합한 전형적인 프로젝트로는 대형 야외 환경을 구현하고 다이내믹 라이팅에 많이 의존하는 게임을 예시로 들 수 있습니다. 언리얼 엔진이 지원하는 디바이스 대부분은 디퍼드 셰이딩에 필요한 하드웨어 사양을 충족하며, 디퍼드 셰이딩을 사용했을 때 퍼포먼스상 이점이 매우 큽니다. 따라서 UE의 모바일 프로젝트 대부분에 모바일 디퍼드 셰이딩을 사용할 것을 권장합니다. 그러나 프리컴퓨티드 라이팅을 주로 사용하는 경우에는 포워드 셰이딩 모델이 나을 수 있으며, 로컬 라이트나 다수의 리플렉션 캡처를 사용할 때 그 장점이 발휘됩니다.
모바일 디퍼드 셰이딩에서 지원되는 렌더링 기능
이 섹션은 모바일 디퍼드 셰이딩 모드에서 지원되며 모바일 포워드 셰이딩 모드에서는 사용할 수 없는 렌더링 기능의 목록입니다.
라이팅 기능
모바일 디퍼드 셰이딩 모드는 다음 라이팅 기능을 제공합니다.
- 라이트 함수
- 라이트 프로파일
- IES 라이트 프로파일
-
릿 데칼
- 향상된 로컬 라이트 렌더링 효율성
렌더링 제한 사항
프리컴퓨티드 라이팅 및 셰이딩 모델 제한 사항
프로젝트에 프리컴퓨티드 라이팅을 사용하는 경우 디퍼드 셰이딩은 기본 릿(DefaultLit) 및 언릿(Unlit) 셰이딩 모델만 제공합니다. 프로젝트에 프리컴퓨티드 라이팅을 사용한다면 디퍼드 셰이딩 대신 포워드 셰이딩을 사용할 것을 강력하게 권장합니다.
반투명 패스
반투명은 디퍼드 셰이딩 모드에서 사용 가능하지만, 반투명 패스는 항상 포워드 셰이딩을 사용합니다. 유리나 물과 같은 반투명 머티리얼의 라이팅 모드(Lighting Mode) 를 표면 포워드 셰이딩(Surface ForwardShading) 으로 설정해야 합니다.
멀티 샘플 안티 에일리어싱(MSAA)
디퍼드 렌더링은 G 버퍼에 필요한 공간 문제로 인해 멀티 샘플 안티 에일리어싱(Multi-Sample Anti-Aliasing, MSAA) 을 지원하지 않습니다. 또한 각 픽셀이 아니라 각 샘플을 셰이딩해야 하기 때문에 셰이딩 패스가 더 리소스 집약적입니다.
릿 데칼 제한 사항
릿 데칼(Lit decals) 은 데칼에 추가 버퍼가 필요하기 때문에 디퍼드 모드의 스태틱 라이팅에서 지원되지 않으며, 메모리 제약으로 인해 모바일 디바이스에서 사용할 수 없습니다. 그러나 스태틱 라이팅에 이미시브 데칼은 사용할 수 있습니다.
기타 데칼 제한 사항
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 버퍼까지 확장되어 사용자 디바이스의 전체 기능을 사용합니다.