포워드 셰이딩 렌더러

포워드 셰이딩 렌더러를 사용하여 VR 퍼포먼스를 향상시키는 법입니다.

Windows
MacOS
Linux

기본적으로 언리얼 엔진 4 는 Deferred Renderer (디퍼드 렌더러)를 사용하는데, 유연성이 높고 보다 많은 렌더링 기능을 소화할 수 있기 때문입니다. 하지만 그에 따르는 디퍼드 렌더러의 단점으로 인해 모든 VR 체험에 적합하지는 않을 수도 있습니다. Forward Rendering (포워드 렌더링)은 보다 빠른 렌더링 패스로 보다 빠른 기반을 제공하기에 VR 플랫폼에서 더 나은 퍼포먼스를 보일 수 있습니다. 포워드 렌더링은 빠를 뿐만 아니라, 디퍼드 렌더러보다 나은 안티에일리어싱 옵션이 제공되어 보다 산뜻한 비주얼을 낼 수 있습니다.

포워드 셰이딩 켜기

포워드 셰이딩 렌더러를 켜려면:

  1. 편집 메뉴에서 프로젝트 세팅 을 엽니다.

  2. 왼편의 렌더링 탭을 선택하고 Forward Shading (포워드 셰이딩) 카테고리를 찾습니다.

  3. Forward Shading (포워드 셰이딩) 옵션을 켭니다.

EnableForwardShading.png

에디터를 재시작하겠냐고 묻는 창이 뜨는데, 재시작 후에는 포워드 렌더러 옵션과 기능을 사용할 수 있습니다.

멀티샘플 안티에일리어싱 켜기

멀티샘플 안티에일리어싱(MSAA)을 사용하려면:

  1. 편집 메뉴에서 프로젝트 세팅 을 엽니다.

  2. 왼편의 렌더링 탭을 선택하고 Default Settings (기본 세팅) 카테고리를 찾습니다.

  3. Anti-Aliasing Method (안티에일리어싱 메서드) 프로퍼티를 MSAA 로 변경합니다.

EnableMSAA.png

포워드 렌더러는 대부분의 경우 MSAA 와 템포럴 안티에일리어싱(TAA) 둘 다 지원합니다만, 지오메트리와 스페큘러의 계단현상을 제거해 주므로 TAA 가 낫습니다. 하지만 VR 에서는, 헤드 트래킹으로 인한 서브 픽셀의 지속적인 움직임으로 인해 원치않는 블러 현상이 생기므로, MSAA 쪽이 낫습니다. MSAA 를 사용하는 프로젝트는 MSAA 를 사용하여 콘텐츠를 만들어야 스페큘러 계단현상이 줄어들 것입니다. 추가적으로 Normal to Roughness (노멀을 러프니스로) 기능을 통해 디테일 노멀 맵과 자동 LOD 생성에서 발생되는 스페큘러 계단현상을 줄일 수 있는데, 스태틱 메시가 원거리의 메시에 있는 것들을 평탄화시켜 작은 트라이앵글에서의 계단현상을 줄이는 데 도움이 되기 때문입니다.

저희 쪽의 테스트에서, TAA 대신 MSAA 를 사용하니 GPU 프레임 시간이 약 25% 향상되었습니다 (실제 비용은 콘텐츠에 따라 다릅니다).

아래는 템포럴 AA 와 2X MSAA 의 효과 비교 예제입니다.

템포럴 AA

4X MSAA

r.MSAACount 콘솔 변수를 사용하여 모든 픽셀마다 MSAA 샘플을 몇이나 계산할지 조절할 수 있습니다. r.MSAACount 1 는 MSAA 를 끕니다. r.MSAACount 0 을 할당하면 템포럴 AA 로 예비 전환되므로, 안티에일리어싱 메서드를 편하게 전환할 수 있습니다.

퍼포먼스 및 기능

디퍼드 렌더러에서 포워드 렌더러로 전환하면 프로젝트의 퍼포먼스가 향상될 수 있습니다.

포워드 렌더러는 콘텐츠에 따라 디퍼드 렌더러보다 빠를 수 있습니다. 대부분의 퍼포먼스 향상은 머티리얼 단위로 끌 수 있는 기능에서 옵니다. 기본적으로는 머티리얼에서 하이 퀄리티 리플렉션을 선택하지 않는 한 가장 가까운 캡처만 시차 보정 없이 적용하고, 하이트 포그는 버텍스 단위로 계산하며, 플레이너 리플렉션은 그 옵션을 켠 머티리얼에만 적용합니다.

ForwardShading.png

이러한 옵션을 에픽의 VR 게임 신작 "로보 리콜"에서 활용했더니, NVIDIA 970 GTX 에서 디퍼드 렌더러보다 포워드 렌더러가 약 22% 빨랐습니다.

ExampleImage.png

포워드 렌더러 작동 방식은 라이트와 리플렉션 캡처를 컬링하여 프러스텀 스페이스 그리드에 넣습니다. 그런 다음 포워드 패스의 각 픽셀에 대해 영향을 끼치는 라이트와 리플렉션 캡처를 대상으로 반복처리하여, 머티리얼을 공유하는 것입니다. 스테이셔너리 라이트에 대한 다이내믹 섀도는 미리 계산하여 스크린 스페이스 섀도 마스크의 채널에 패킹해 넣는데, 이는 스테이셔너리 라이트는 4 개까지만 겹칠 수 있다는 한계 때문입니다.

게임을 디퍼드 렌더러에서 포워드 렌더러로 전환할 때의 퍼포먼스를 측정하려면 언리얼 엔진의 퍼포먼스와 프로파일링 툴을 사용하세요. 구체적으로 어디에 GPU 비용이 드는지에 대해서는 GPU 프로파일링, 프로파일링 관련 지원은 Stat Commands 문서를 참고하세요.

현재 지원되는 기능

현재 포워드 렌더러에서 지원되는 기능은 다음과 같습니다:

  • 스테이셔너리 라이트 완벽 지원, 무버블 오브젝트의 동적 그림자와 미리 계산한 배경 그림자의 자연스러운 블렌딩

  • 시차 보정을 포함한 다중 리플렉션 캡처 블렌딩

  • 씬의 일부분에 대한 플레이너 리플렉션이 리플렉션 캡처에 합성

  • DBuffer 데칼

  • 프리컴퓨티드 비저빌리티 및 스카이 라이트

  • 그림자 없는 무버블 라이트 개수 무제한

  • 캡슐 섀도

  • 마스크드 머티리얼에 대한 알파-투-커버리지

  • 인스턴스드 스테레오 호환

  • 그림자를 드리우는 무버블 라이트 최대 4 중첩

  • 그림자를 드리우는 라이트에 라이트 함수

알려진 문제점 & 잦은 질문

포워드 렌더러에서 아직 지원되지 않는 기능은 다음과 같습니다:

  • 스크린 스페이스 기법 (SSR, SSAO, 컨택트 섀도)

  • 반투명에 동적 그림자

  • 스테이셔너리 라이트에서 배경 그림자를 받는 반투명

  • D-Buffer 데칼 및 모션 블러

포워드 렌더러의 실험단계 버전 사용시 발생할 수 있는 질문/문제점은 다음과 같습니다.

  • 포워드 렌더러로 전환할 때 제 머티리얼이 깨지는데, GBuffer 씬 텍스처 관련해서 무언가 있나요?

    • GBuffer 액세스는 포워드 렌더러에서의 텍스처 샘플링에 사용할 수 없으며, 디퍼드 렌더러에서만 사용할 수 있습니다.

  • 포워드 렌더러에서 디퍼드 렌더러보다 텍스처 샘플을 적게 하는 것이 가능한가요?

    • 포워드 랜더러는 모든 기능을 하나의 셰이더에 패킹하므로 머티리얼에서 사용할 수 있는 텍스처 샘플이 적습니다.

    • 보통 이 문제는 공유 샘플러를 사용하여 해결할 수 있습니다.

  • MSAA 가 애트머스페릭 포그에 대한 샘플을 찾지 못하는 문제가 왜 생기나요?

    • 애트머스페릭 포그는 아직 MSAA 를 제대로 처리하지 못합니다.

    • 하이트 포그의 경우, 버텍스 포그 기능으로 우회할 수 있습니다 (포워드 셰이딩을 켜면 기본으로 켜집니다).

    • 포워드 베이스 패스에서 계산하므로 안티에일리어싱이 제대로 나오는 것입니다.

    • 아직 애트머스피어 계산은 리졸브된 씬 뎁스와 떨어진 디퍼드 패스에서 이루어지므로 안티에일리어싱이 제대로 되지 않습니다 (앞으로 수정할 예정입니다).

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼