GoogleVR 실전 사례

GoogleVR UE4 프로젝트를 최대한 활용하는 법에 관련된 정보입니다.

Windows
MacOS
Linux

가상 현실(VR) 프로젝트용 콘텐츠를 개발할 때, 사용자에게 최적의 VR 체험을 선사하기 위해 밟아야 하는 단계가 몇 가지 있습니다. 여기서는 GoogleVR 을 사용하여 프로젝트를 확인할 때 사용자에게 최적의 체험을 제공하기 위해 알아야 하는 모든 것들을 다뤄보겠습니다.

GoogleVR 렌더링 옵션

언리얼 엔진과 GoogleVR 이 만나면 매우 몰입도 높은 VR 체험을 만들어내는 것이 가능하지만, GoogleVR 의 하드웨어 제약으로 인해 언리얼 엔진이 낼 수 없는 렌더링 피처가 몇 가지 있습니다. 그 제약 중 다수는 모바일 디바이스 의 제약과 비슷합니다. 하지만 GoogleVR 고유 렌더링 요구사항으로 인해, 추가로 고려해야 할 사항이 몇 가지 있습니다. 여기서는 그 요구사항은 무엇이며 GoogleVR 프로젝트에 어떤 영향을 주는지 다뤄보겠습니다.

모노스코픽 파 필드

Monoscopic Far Field 모노스코픽 파 필드 렌더링(, 보다 정확하게는 하이브리드 모노스코픽 렌더링)은 언리얼 엔진 4 (UE4)로 제작중인 VR 모바일 어플리케이션에 쓸 수 있는 고급 렌더링 피처입니다. 일반적으로, 모노스코픽 파 필드 렌더링은 원거리 콘텐츠 양이 상당한 레벨의 퍼포먼스를 향상시켜줍니다. 그 이유는 원거리 오브젝트를 양쪽 눈에 한 번만 렌더링하기 때문입니다. 에픽의 관찰에 따르면, 원거리 오브젝트를 이런 식으로 렌더링하니 VR 모바일 어플리케이션 퍼포먼스가 크게 향상되었습니다.

모바일 HDR

Mobile HDR 은 GoogleVR 에 작동하지 않으니, 끈 채로 놔둬야 합니다.

포스트 프로세싱

GoogleVR 의 높은 렌더링 요구사항으로 인해, 다수의 포스트 프로세싱 피처는 아쉽게도 작동하지 않습니다. GoogleVR 에 작동하는 포스트 프로세스 피처 전체 목록은 아래와 같습니다.

포스트 프로세싱 섹션

피처 이름

설명

Auto Exposure 자동 노출

Exposure Bias 노출 편향치

씬 밝기를 높이거나 낮추는 데 사용할 수 있습니다.

머티리얼

GoogleVR 프로젝트용 머티리얼을 만들고 상호작용하는 것은 다른 프로젝트용 머티리얼을 만들고 상호작용하는 것과 매우 비슷합니다. 여전히 머티리얼 에디터를 사용하여 머티리얼을 만들고, 여전히 머티리얼 에디터에서 찾을 수 있는 머티리얼 노드 다수를 사용할 수 있습니다. 하지만 하드웨어에서 정상 작동하도록 하기 위해 GoogleVR 용 머티리얼을 만들 때 지켜야 하는 제약/고려사항이 몇 가지 있습니다.

머티리얼 입력 이름

설명

Base Color

베이스 컬러 - 머티리얼의 전반적인 색을 정의합니다.

Roughness

러프니스 - 머티리얼이 나타내는 전반적인 거친 또는 부드러운 정도를 정의합니다.

Metallic

메탈릭 - 머티리얼의 금속성을 정의합니다.

Specular

스페큘러 - 리플렉션의 세기, 즉 머티리얼의 광택 정도를 정의합니다.

Normal

노멀 - 표면에 디테일을 추가해 주며, 실제 모델링을 통해 표현했다면 비용이 매우 비쌀 것입니다. 노멀 맵이 있는 표면은 완전히 평평하거나 부드러워 보이지 않고 주름이나 굴곡진 것처럼 보이도록 만들 수 있습니다.

Emissive

이미시브 - 머티리얼의 일부분이 빛을 내는 것처럼 밝아 보이게 만드는 데 도움이 됩니다.

Opacity

오파시티 주어진 픽셀의 투명도를 정의하는 것으로, 0.0 1.0 값입니다.

Opacity Mask

오파시티 마스크 - 개별 픽셀의 완전 불투명 또는 완전 투명 상태를 설정할 수 있습니다.

유념할 점은, 반투명과 마스크드 머티리얼 양쪽 모두 렌더링 비용이, 스마트폰같은 하드웨어에서는 특히 비쌀 수 있습니다. 가급적 오파크 머티리얼 을 사용하는 것이 렌더링 비용이 훨씬 저렴하므로 좋습니다.

머티리얼 셰이딩 모델

하드웨어 제약으로 인해, GoogleVR 을 사용하는 프로젝트에서 사용할 수 있는 머티리얼 셰이딩 모델 은 다음과 같습니다.

셰이딩 모델 이름

설명

Default Lit

기본 라이팅 - 이름 그대로 기본 셰이딩 모델이며, 가장 자주 사용하게 될 모델입니다. 이 셰이딩 모델은 직사광과 간접광 뿐만 아니라 리플렉션에 스페큘러도 활용합니다.

Unlit

라이팅제외 - 컬러에 이미시브만 출력하여, 화염이나 발광 오브젝트같은 특수 효과에 좋습니다.

GoogleVR 프로젝트에서는 가급적 Unlit Shading Model 을 사용하는 것이 좋습니다. 비용이 가장 저렴하기 때문입니다.

머티리얼 블렌드 모드

Material Blend Mode 는 배경에 이미 그려진 것과 현재 머티리얼을 블렌딩하는 방식을 결정합니다. GoogleVR 용 콘텐츠를 만들 때 사용할 수 있는 머티리얼 블렌드 모드는 다음과 같습니다.

블렌드 모드

설명

Opaque

불투명 - 입체 오브젝트의 경우, 불투명 머티리얼이 가장 쌉니다. 하지만 이름에서 암시하듯, 투명도를 지원하지 않습니다. 절대 오버드로가 생기지 않으며, 머티리얼의 한 픽셀을 렌더링하는 데 **노드 그래프** 복잡도에 따라 항상 똑같은 시간이 걸린다는 뜻입니다.

Masked

마스크 - 머티리얼에 일부 픽셀을 그리지 않도록 할 필요가 있는 경우 사용합니다. 이 머티리얼은 마스크로 걸러내는 영역에 대해서만 오버드로가 발생합니다. 하지만 머티리얼이 그리는 각 픽셀은 100% 불투명이거나 100% 투명입니다. 마스크 적용 영역이 크면 클 수록 오버드로 발생량도 많아집니다.

Translucent

반투명 - 가장 비싼 **블렌드 모드** 입니다. 마스크 또는 불투명과 똑같아 보일 수 있지만, 실제 투명 여부와는 관계 없이 퍼포먼스에 추가적인 영향을 줍니다.

Additive

애디티브 - 반투명의 저렴한 버전입니다. 픽셀 소팅을 하지 않으며, 그냥 씬에 더하기만 합니다. 그때문에 애디티브 머티리얼은 커버된 픽셀을 밝게만 할 수 있습니다. 머티리얼의 검정 픽셀은 씬에 영향을 주지 않습니다.

Modulated

모듈레이트 반투명의 또다른 저렴한 버전으로, 씬의 기존 색에 세기를 곱합니다. 색이 0.0 1.0 범위로 매핑되므로, 모듈레이트 머티리얼은 씬을 어둡게만 할 수 있습니다. 이 머티리얼의 하양 픽셀은 씬에 영향을 주지 않습니다.

모듈레이트 블렌드 모드를 사용할 때는 머티리얼에 Separate Translucency (독립 반투명) 옵션을 끄지 않으면 머티리얼이 제대로 컴파일되지 않을 것입니다.

T_Separate_Trans.png

모바일 전용 머티리얼 세팅

메인 머티리얼 노드디테일 패널에서 Mobile (모바일) 이라는 섹션을 찾을 수 있습니다. 여기 있는 세팅은 모바일 디바이스에서의 머티리얼 렌더링 비용을 절감하는 데 도움이 됩니다.

프로퍼티

설명

Fully Rough

최대 러프니스 - 켜면, 셰이더 ALU 인스트럭션 몇 개와 샘플러 하나를 절약합니다. 전반적인 반사 에너지를 유지하면서 실제적으로 스페큘러를 끄는 효과를 냅니다.

Use Lightmap Directionality

라이트맵 방향성 사용 - 끄면, 라이트 맵에서의 라이팅이 밋밋해지지만 비용이 저렴해집니다.

커스터마이즈드 UV

Customized UVs 는 특정 연산을 픽셀 셰이더가 아닌 버텍스 셰이더에서 하도록 하여 종속 텍스처 페치를 피하는 데 도움이 됩니다. 텍스터 타일링을 현재보다 많아 보이도록 하기 위한 UV 조작같은 단순 작업을 할 때 많이 필요한 퍼포먼스를 되찾는 데 아주 좋습니다. 가급적 모든 UV 조작 작업은 Customized UVs 를 활용하는 것이 좋으며, GoogleVR 용 콘텐츠를 개발할 때는 특히나 그렇습니다.

Customized UVs 는 현재 스태틱 메시, 스켈레탈 메시, BSP, 랜드스케이프, 메시 파티클과 같은 특정 컴포넌트 유형에 대해서만 구현되어 있습니다.

리플렉션

GoogleVR 은 스크린 스페이스 리플렉션(SSR)을 지원하지 않습니다. 즉 레벨에 배치된 리플렉션 캡처 액터 를 통해서만 리플렉션을 생성할 수 있다는 뜻입니다. 또한, 리플렉션 액터로부터 생성된 리플렉션은 하드웨어 제약으로 인해 충실도가 그리 높지 않다는 점 유념해 주시기 바랍니다.

GoogleVR & 콘텐츠 구성

GoogleVR 프로젝트용 아트 콘텐츠를 제작할 때, 프로젝트가 최대한 부드럽게 실행되도록 하기 위해 유념해야할 것들이 몇 가지 있습니다. 여기서는 GoogleVR 용 아트 콘텐츠를 제작할 때 고려해야할 것들을 살펴보겠습니다.

콘텐츠 하드웨어 제약

모바일 디바이스의 특정 하드웨어 제약으로 인해, 콘텐츠를 제작할 때 지켜야 하는 사항은 다음과 같습니다. 이 사항을 지키지 않으면 프로젝트가 정상 작동하지 않을 것입니다.

  • 모든 메시 유형의 최대 버텍스 수는 65,000 으로, 모바일 하드웨어에서 32 비트 인덱스가 지원되지 않기 때문입니다.

  • 스켈레탈 메시의 최대 본 수는 75 개입니다.

메시 고려사항

GoogleVR 프로젝트에 사용할 메시를 제작할 때는 다음과 같은 사항을 유념해야 GoogleVR 에서 정상 작동할 것입니다.

  • 3D 메시에는 머티리얼 ID 를 가급적 적게 사용해야 드로 콜을 줄일 수 있습니다.

  • 가급적 스태틱 메시 LOD 를 사용하도록 하세요.

  • 3D 메시 폴리콘 수를 주의깊에 보면서 가급적 로우 폴리 를 유지하도록 하세요.

  • 모든 스태틱 모델에 이차 UV 세트를 준비하여 라이트 매핑 을 활용하도록 하세요.

  • 가급적 렌더링 비용이 훨씬 싼 임포스터 스프라이트 를 활용하여 멀리 있는 스태틱 메시를 대체하도록 하세요.

텍스처 고려사항

GoogleVR 프로젝트에 사용할 텍스처를 만들 때 프로젝트의 전반적인 퍼포먼스를 갉아먹지 않도록 하려면 다음과 같은 정보를 염두에 두어야 합니다.

  • 텍스처 크기는 X 든 Y 든 2048 픽셀을 넘을 수 없습니다.

  • 텍스처 크기는 어느 한 축이든 2 제곱 크기여야 합니다. 예를 들어 이미지 폭이 128 픽셀이든 256 픽셀이든 괜찮지만, 129 는 안됩니다.

  • GoogleVR 에서 메모리에 로드할 수 있는 텍스처 최대 량은 512 MB 지만, 언제든 메모리에 로드된 텍스처 크기는 128 MB 를 넘지 않도록 하는 것이 좋습니다.

  • 가급적 정사각 (1024x1024 픽셀처럼 폭과 높이가 같은) 텍스처를 사용하세요. 메모리 사용 효율이 좋습니다.

  • 텍스처의 메모리 필요량을 줄이기 위해 가급적 텍스처 아틀라싱 을 활용하도록 하세요.

  • RGB 텍스처 마스킹 / 패킹 은 메모리의 고유 텍스처 수를 줄이는 데 뛰어난 방법입니다.

  • TC_DefaultTC_NormalMap 압축 세팅만 사용해야 합니다. 모바일 플랫폼에서 작동되는 것은 이 둘 뿐입니다.

레벨 고려사항

GoogleVR 에서 레벨의 퍼포먼스를 최대한 뽑아내는 것은 미묘한 밸런싱 작업이라 제대로 하는 데는 시간을 들여야 합니다. 퍼포먼스 이슈가 생길 수 있는 레벨 영역을 빠르게 알아내는 데 도움이 될 수 있는 제안사항은 다음과 같습니다:

  • 레벨의 라이팅 빌드 상황을 유지하여 최적의 퍼포먼스를 내도록 하세요. 에디터에서 빨강 "Lighting needs to be rebuilt" 오류 메시지를 통해 라이팅 빌드를 해야 할 시점을 알려줍니다.

  • 레벨의 모든 라이트가 스태틱 으로 설정되어 있는지 확인합니다. 다른 라이팅 옵션은 렌더링 비용이 비쌀 수 있습니다.

  • 레벨에서 프리컴퓨티드 비저빌리티 를 활용하는지, 아니면 레벨에 하나 추가하고 라이팅을 리빌드하여 레벨의 월드 세팅에서 활성화시킵니다.

  • 전체 씬의 드로 콜은 어떤 뷰에서는 100 을 넘어서는 안됩니다. 디바이스에서 stat openglrhi 명령으로, PC 의 ES2 프리뷰어에서 stat d3d11rhi 명령으로 확인할 수 있습니다.

  • 레벨의 총 트라이앵글 수는 어떤 뷰에서는 100,000 을 넘어서는 안됩니다. 디바이스에서 stat openglrhi , PC 의 ES2 프리뷰어에서 stat d3d11rhi 명령으로 확인할 수 있습니다.

  • 레벨에 반투명 및 오파시티 마스크 머티리얼을 사용할 때는 비용이 비쌀 수 있으니 조심하세요.

  • 레벨의 퍼포먼스 프로파일 을 자주 돌려 퍼포먼스 이슈를 제때 잡아낼 수 있도록 하세요.

Tags
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback