가상현실(Virtual Reality, VR)은 몰입감 있는 새로운 매체로, 가상현실 플랫폼에서 콘텐츠를 제작하고 사용자에게 선보이려면 독특한 측면을 고려해야 합니다. 사용자 편의, 콘텐츠 최적화, 플랫폼의 제한 사항이 여기에 포함됩니다. VR용 프로젝트를 개발할 때 이러한 주제에 대한 레퍼런스로 이 페이지를 사용하세요.
VR 프로젝트 세팅
VR 프로젝트는 블루프린트 또는 C++ 프로젝트로 생성할 수 있습니다.
VR 플랫폼을 타기팅하여 새 프로젝트를 생성할 때는 게임(Games) 카테고리의 VR 템플릿(VR Template) 으로 시작합니다. VR 템플릿에는 언리얼 엔진 5에서 VR 프로젝트 개발을 시작할 때 필요한 모든 것이 있습니다.
프로젝트의 베이스로 VR 템플릿을 사용하고 싶지 않은 경우, 다음 세팅을 통해 새 기본 C++ 또는 블루프린트 프로젝트를 생성할 수 있습니다.
- 퀄리티 프리셋: Scalable
- 레이 트레이싱: Disabled
- 시작용 콘텐츠: Disabled

이렇게 세팅하면 최소한의 렌더링 기능이 활성화된 언리얼 프로젝트를 생성됩니다. 이를 통해 프로젝트가 양호한 프레임 레이트로 시작되도록 한 후, 필요한 기타 렌더링 기능을 추가할 수 있습니다.
프로젝트를 생성한 후에는 다음과 같은 프로젝트 세팅을 설정하여 앱의 퍼포먼스를 향상합니다.
- 편집(Edit) > 프로젝트 세팅(Project Settings) > 설명(Description) 으로 이동하여 VR로 시작(Start In VR) 을 활성화합니다.
- 편집 > 프로젝트 세팅 > 렌더링(Rendering) > 포워드 렌더러(Forward Renderer) 에서 포워드 셰이딩을 활성화합니다.
- 편집 > 프로젝트 세팅 > 렌더링 > 디폴트 세팅(Default Settings) 에서 안티 에일리어싱 메서드(Anti-Aliasing Method) 를 멀티 샘플 안티 에일리어싱(Multisample Anti-Aliasing, MSAA)으로 설정합니다.
- 편집 > 프로젝트 세팅 > 렌더링 > VR 에서 인스턴스드 스테레오를 활성화합니다.
- 모바일 VR 경험의 경우 편집 > 프로젝트 세팅 > 렌더링 > VR 에서 모바일 멀티 뷰를 활성화합니다.
- 또한 모바일 HDR(Mobile HDR)을 False로 설정합니다.
VR.ini 세팅
앱의 그래픽 스케일을 조절하여 퍼포먼스나 퀄리티를 향상하는 과정에 대한 설명 및 예시는 엔진 퀄리티 레퍼런스를 참조하세요. 다음 표는 VR 프로젝트를 위한 일부 콘솔 변수와 추천하는 값을 설명합니다.
콘솔 변수 | 추천하는 값 | 설명 |
---|---|---|
vr.PixelDensity | 1 | 1 은 현재 사용되는 HMD의 이상적인 해상도입니다. 값이 낮으면 수행 속도는 빨라지지만 언더샘플링이 일어나 더 흐려지며, 값이 1 보다 크면 수행 속도가 느려지고 슈퍼샘플링되어 선명도가 매우 높아집니다. |
r.SeparateTranslucency | 0 | 필 레이트 제한으로 인해 모바일 VR 경험에는 비용이 높을 수 있습니다. 이 기능은 비활성화하는 것이 좋습니다. |
r.HZBOcclusion | 0 | 자세한 정보는 비저빌리티 컬링 페이지의 계층형 Z 버퍼 오클루전 섹션을 참조하세요. |
다음 .ini 세팅은 UE4 기반 VR 데모 Showdown에서 가져온 것입니다. 프로젝트의 Config/DefaultEngine.ini 파일에 있는 SystemSettings 에 이러한 세팅을 복사하여 시작점으로 활용해 보세요.
[SystemSettings]
vr.PixelDensity=1
r.SeparateTranslucency=0
r.HZBOcclusion=0
r.MotionBlurQuality=0
r.PostProcessAAQuality=3
r.BloomQuality=1
r.EyeAdaptationQuality=0
r.AmbientOcclusionLevels=0
r.SSR.Quality=1
r.DepthOfFieldQuality=0
r.SceneColorFormat=2
r.TranslucencyVolumeBlur=0
r.TranslucencyLightingVolumeDim=4
r.MaxAnisotropy=8
r.LensFlareQuality=0
r.SceneColorFringeQuality=0
r.FastBlurThreshold=0
r.SSR.MaxRoughness=0.1
r.rhicmdbypass=0
sg.EffectsQuality=2
sg.PostProcessQuality=0
VR 프레임 레이트 최적화
VR 애플리케이션 대부분은 자체적인 절차를 구현하여 VR 프레임 레이트를 제어합니다. 따라서 VR 애플리케이션을 방해할 수 있는 몇 가지 일반 UE4 프로젝트 세팅을 비활성화해야 합니다.
UE의 일반 프레임 레이트 세팅을 비활성화하려면 다음 단계를 따르세요.
-
에디터의 메인 메뉴에서 편집(Edit) > 프로젝트 세팅(Project Settings)을 선택하여 프로젝트 세팅 창을 엽니다.
-
프로젝트 세팅 창의 엔진(Engine) 섹션에서 일반 세팅(General Settings)을 선택합니다.
-
프레임 레이트(Framerate) 섹션에서 다음을 수행합니다.
-
스무드 프레임 레이트(Smooth Frame Rate) 비활성화
-
고정된 프레임 레이트 사용(Use Fixed Frame Rate) 비활성화
-
커스텀 타임스텝(Custom TimeStep)을 없음(None)으로 설정
-

VR 월드 스케일
월드의 올바른 스케일을 지정하는 것은 VR 플랫폼에서 최상의 사용자 경험을 제공하도록 돕는 가장 중요한 방법 중 하나입니다. 스케일이 올바르지 않은 경우 사용자가 각종 감각 문제를 겪을 수 있으며, 시뮬레이션 멀미를 유발할 수도 있습니다. VR의 오브젝트는 플레이어의 카메라로부터 0.75~3.5미터 범위에 있을 때 가장 쉽게 볼 수 있습니다. UE4 내에서 1언리얼 유닛(UU)은 1센티미터(cm)와 같습니다. 즉, VR 사용 시 언리얼 내 오브젝트는 플레이어의 카메라로부터 75UU~350UU 떨어져 있을 때 가장 잘 보입니다.
거리 | 언리얼 유닛(UU) 단위 거리 |
---|---|
1cm | 1언리얼 유닛 |
1m | 100언리얼 유닛 |
1km | 100,000언리얼 유닛 |
월드 세팅(World Settings) 아래의 월드 투 미터(World to Meters) 변수를 사용하여 월드의 스케일을 조정할 수 있습니다. 이 숫자를 올리거나 내릴 경우 사용자는 자신이 주변 월드에 비해 크거나 작다고 느끼게 됩니다. 콘텐츠가 1언리얼 유닛 = 1cm로 빌드되었다고 가정할 경우, 월드 투 미터 를 10 으로 설정하면 월드가 매우 커 보이고, 월드 투 미터를 1000 으로 설정하면 월드가 매우 작아 보입니다.

VR과 시뮬레이션 멀미
시뮬레이션 멀미는 몰입감 있는 경험 도중 사용자에게 영향을 끼칠 수 있는 멀미의 한 형태입니다. 다음 목록은 사용자가 VR에서 경험할 수 있는 불편을 제한할 수 있는 몇 가지 모범 사례를 설명합니다.
- 프레임 레이트 유지: 프레임 레이트가 낮아질 경우 시뮬레이션 멀미가 생길 수 있습니다. 프로젝트를 최대한 최적화하면 사용자의 경험을 향상할 수 있습니다. XR 플랫폼에 타기팅해야 하는 권장 프레임 레이트는 다음 표를 참조하세요.
HMD 디바이스 | 타깃 프레임 레이트 |
---|---|
Oculus Rift S | 90 |
Oculus Quest 1 | 72 |
Oculus Quest 2 | 상황에 따라 72/80/90/120 |
HTC Vive | 90 |
HTC Vive Pro | 90 |
Valve Index | 최소 90, 최대 144 |
HP Reverb | 90 |
Windows Mixed Reality VR | 90 |
PSVR | 상황에 따라 60/120, 90/90, 120/120 |
* 사용자 테스트: 여러 다양한 사용자와 테스트해 보고, VR 앱에서 사용자가 경험할 수 있는 불편이 있다면 모두 모니터링하여 시뮬레이션 멀미를 예방합니다.
-
사용자가 계속 카메라를 제어할 수 있도록 유지: 시네마틱 카메라 등 플레이어가 카메라 이동을 제어할 수 없는 경우 몰입감 있는 경험에서 사용자의 불편을 초래할 수 있습니다. 고개를 좌우로 흔드는 헤드 보빙이나 카메라 셰이크 같은 카메라 이펙트는 사용자가 제어할 수 없을 경우 사용자의 불편으로 이어질 수 있으므로 피해야 합니다.
-
필드 오브 뷰(Field Of View, FOV)가 디바이스와 일치해야 함: FOV 값은 디바이스의 SDK 및 내부 환경설정을 통해 설정되며, 헤드셋 및 렌즈의 물리적 지오메트리와 일치합니다. 따라서 FOV는 UE에서 수정해서는 안 되며, 사용자가 수정할 수 없어야 합니다. FOV 값이 변경되면 머리를 돌릴 때마다 월드가 휘어지는 것처럼 보이므로 불편할 수 있습니다.
-
어두운 라이트 및 컬러를 사용하고, 번짐 이펙트 피하기: VR의 요소를 디자인할 때는 일반적으로 사용하는 것보다 어두운 라이트 및 컬러를 사용해야 할 수 있습니다. VR에서 강렬하고 선명한 라이팅을 사용하면 시뮬레이션 멀미가 더 일찍 발생할 수 있기 때문입니다. 서늘한 셰이드와 어두운 라이트를 사용하면 사용자의 불편을 예방하는 데 도움이 됩니다. 이렇게 하면 디스플레이의 밝은 영역과 어두운 영역 간의 번짐 이펙트 방지에도 도움이 됩니다.
-
이동 속도 변경하지 않기: 사용자는 점진적인 가속을 통해 최대 속도로 나아가는 것이 아니라 처음부터 최대 속도로 시작해야 합니다.
-
사용자에게 보이는 모습에 크게 영향을 미치는 포스트 프로세스 이펙트 피하기: 사용자의 불편을 예방하기 위해 뎁스 오브 필드와 모션 블러 같은 포스트 프로세스 이펙트는 피합니다.
-
모션 블러와 뎁스 오브 필드 같은 비주얼 이펙트는 피해야 합니다.
-
VR 캐릭터에서 조금씩 수정되어야 하는 요소인 캐릭터 신장, 폭, 속도, 카메라 위치 등을 고려합니다.
VR 카메라 구성
UE4의 VR 카메라 구성은 VR 경험을 앉아서 하는지, 아니면 서서 하는지에 따라 완전히 달라집니다.
- 앉아서 하는 경험: 프로젝트에서 원하는 플레이어 신장까지 카메라 원점을 인위적으로 올려야 합니다. 그런 다음 Set Tracking Origin 함수를 호출하여 원점을 '눈 높이(Eye Level)'로 설정합니다.

- 서서 하는 경험: 카메라 원점이 주로 지면에 있는 폰의 루트에 상대적으로 0 으로 설정되어 있어야 합니다. 씬 컴포넌트에서 지표면에 있는 폰의 베이스 부분에 카메라 컴포넌트를 어태치합니다. 그런 다음 Set Tracking Origin을 호출하고 원점 파라미터를 바닥 높이(Floor Level)로 설정합니다.


VR 콘텐츠 고려 사항
VR 콘텐츠를 만들 때는 사용자가 다양한 각도에서 콘텐츠를 볼 수 있다는 점을 염두에 두어야 합니다. VR용 콘텐츠를 만들 때 다음 목록을 레퍼런스로 활용하시기 바랍니다.
-
스케일: VR 월드의 오브젝트 스케일은 현실을 최대한 모방해야 합니다. 오브젝트를 현실의 원본보다 크거나 작게 만들면 혼란이나 시뮬레이션 멀미가 발생할 수 있습니다.
-
폴리곤 페이스 생략: 일반 경험에서는 플레이어가 볼 수 없는 폴리곤 페이스를 오브젝트에서 제거하는 것이 보통입니다. 하지만 VR 경험에서는 플레이어의 이동 자유성이 더 높습니다. 폴리곤 페이스를 생략하면 사용자가 보면 안 되는 부분을 보게 될 수도 있습니다.
-
라이팅 타입: VR 프로젝트에는 스태틱 라이트와 라이트맵을 사용해야 합니다. 이 라이팅 옵션의 렌더링 비용이 가장 낮습니다. 다이내믹 라이팅을 사용해야 하는 경우, 다이내믹 라이팅의 양을 최소한으로 제한하고, 절대 서로 접하지 않도록 해야 합니다.
-
VR 및 VFX: 서브 UV 텍스처를 사용한 불 또는 연기 시뮬레이션 등의 일부 VFX 트릭은 VR에서 볼 때는 별로 잘 구현되지 않습니다. 대부분의 경우, 폭발이나 연기 같은 이펙트를 시뮬레이션하려면 2D 파티클 대신 스태틱 메시를 사용해야 합니다. 카메라와 매우 가까운 곳에서 발생하는 근거리 이펙트는 VR에서 잘 작동하지만, 이펙트가 스태틱 메시 파티클로 구성된 경우에 한합니다.
-
VR 및 투명: 3D 그래픽에서 투명을 렌더링하는 비용은 매우 높습니다. 투명은 보통 변경된 것은 없는지 확인하기 위해 프레임마다 재평가해야 하기 때문입니다. 이 재평가로 인해 VR에서 투명 렌더링 비용은 장점을 넘어설 수 있습니다. 하지만 DitherTemporalAA 머티리얼 함수를 사용하면 이 문제를 우회할 수 있습니다. 이 머티리얼 함수는 머티리얼이 투명을 사용하는 것처럼 보이게 해 주며, 셀프 소팅 같은 투명에서 흔히 발생하는 문제도 피할 수 있습니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
- 가급적 페이크 사용: 다이내믹 섀도나 라이팅처럼 비용이 높은 렌더링 옵션을 재현할 수 있는 영리한 방법을 찾으면 VR 퍼포먼스 목표를 달성하는 데 큰 도움이 됩니다. Showdown에서는 캐릭터가 다이내믹 섀도를 드리우게 했더니 프레임당 비용이 너무 높아지는 바람에 다이내믹 섀도를 프로젝트에서 잘라내야 했습니다. 하지만 이로 인해 캐릭터가 공중에 떠서 이동하는 것처럼 보이게 되었습니다. 이 문제를 해결하기 위해, 월드 내 오브젝트와 캐릭터의 거리를 기반으로 위치 및 강도를 동적으로 조정할 수 있는 페이크 블롭 섀도를 도입했습니다. 이 방법은 캐릭터가 지면이나 다른 오브젝트에 접근하면 캐릭터가 섀도를 드리우는 듯한 이펙트를 구현하는 데 도움이 되었습니다.
-
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
알려진 제한 사항
다음은 HMD의 설계 방식으로 인해 VR에서 예상대로 작동하지 않을 수도 있는 기능과 그에 대한 우회 방법의 목록입니다.
-
스크린 스페이스 리플렉션(Screen Space Reflection, SSR): SSR은 여전히 VR에서 작동하지만, 구현된 리플렉션이 월드에서 반사하는 것과 일치하지 않는 문제가 발생할 수 있습니다. SSR 대신 비용이 더 저렴하고 리플렉션 일치 문제가 덜한 리플렉션 프로브를 사용해 보세요.
-
스크린 스페이스 글로벌 일루미네이션: 스크린 스페이스 기법을 사용하면 HMD의 양쪽 눈 디스플레이에 차이가 생길 수 있습니다. 이러한 차이는 사용자 불편을 야기할 수 있습니다. VR에서 대신 사용하면 좋은 라이팅 타입은 라이팅 타입을 참조하세요.
-
레이 트레이싱(Ray Tracing): 현재 레이 트레이싱을 사용하는 VR 앱의 경우 편안한 VR 경험에 필요한 해상도와 프레임 레이트를 유지할 수 없습니다.
노멀 매핑 문제
VR에서 오브젝트의 노멀 맵을 볼 때 그 임팩트가 이전과 같지 않다는 점을 확인할 수 있습니다. 이는 노멀 매핑이 양안 디스플레이 또는 동작의 시차를 고려하지 않기 때문입니다. 그 결과, VR 디바이스에서 노멀 맵을 보면 종종 평평해 보입니다. 하지만 이 때문에 노멀 맵을 사용해서는 안 된다거나 사용할 필요가 없는 것은 아니며, 노멀 맵의 데이터를 지오메트리로 만드는 것이 더 이득인지 여부를 면밀히 평가해야 한다는 의미일 뿐입니다. 노멀 맵 대신 사용할 수 있는 기법은 다음과 같습니다.
- 패럴랙스 매핑(Parallax Mapping): 패럴랙스 매핑은 한 단계 발전한 노멀 매핑으로, 노멀 매핑과 달리 뎁스 큐를 고려합니다. 패럴랙스 맵은 어느 각도에서 보든 자체 교정을 통해 시점에 맞는 뎁스 정보를 보여 주기 때문에, 패럴랙스 매핑 셰이더는 뎁스 정보를 더 잘 표시하여 오브젝트의 디테일을 더 많이 표현할 수 있습니다. 패럴랙스 맵을 사용하면 가장 좋은 곳은 자갈길이나 디테일이 세밀한 표면입니다.