Найти в Дзене
8bitsage gamedev

Unreal Engine 5 и VR с нуля. Часть 10. Unreal Engine 5.5.3. Настройка VR проекта на С++ для Meta Quest 2, 3, 3s, PRO.

Давно ничего не писал, изучал базу С++ (до сих пор изучаю), знакомился с апи Unreal Engine, читаю книги и смотрю на реализации других авторов.
В общем всё по плану прошлой статьи. Думаю пора начать Pet-проект, а может и что-то интересное из этого выйдет. В качестве IDE использую Rider, по-моему на нём куда стабильнее работать чем Visual Studio. Общими вещами, механиками, я буду делиться в статьях. Чем то уникальным для проекта делиться смысла нет, иначе вроде и смысла тогда в проекте не будет. Есть видео основанное на документе по настройке UE 5.5
https://www.youtube.com/watch?v=EClbEbNcl4k&list=LL&index=6&ab_channel=MamadouBabaei Не забываем установить пакеты под целевую платформу Android Доля рынка VR всё равно вышел на мобильных проектах, поэтому создавать проект буду на Meta Quest 2, 3, 3s, PRO. Если что-то получится, можно расшириться на PICO. А еще в след году обещают выпустить мобильную гарнитуру Samsung и Steam. Поэтому запускаю Unreal Engine 5.5.3 и выбираю: проект Blank,
C++
Оглавление

Введение

Давно ничего не писал, изучал базу С++ (до сих пор изучаю), знакомился с апи Unreal Engine, читаю книги и смотрю на реализации других авторов.
В общем всё по плану прошлой статьи. Думаю пора начать Pet-проект, а может и что-то интересное из этого выйдет.

В качестве IDE использую Rider, по-моему на нём куда стабильнее работать чем Visual Studio.

Общими вещами, механиками, я буду делиться в статьях. Чем то уникальным для проекта делиться смысла нет, иначе вроде и смысла тогда в проекте не будет.

Настройка Unreal Engine 5.5

Unreal Engine 5.5.x for Meta Quest VR | Community tutorial

Есть видео основанное на документе по настройке UE 5.5
https://www.youtube.com/watch?v=EClbEbNcl4k&list=LL&index=6&ab_channel=MamadouBabaei

Не забываем установить пакеты под целевую платформу Android

Создание проекта

Доля рынка VR всё равно вышел на мобильных проектах, поэтому создавать проект буду на Meta Quest 2, 3, 3s, PRO.

Если что-то получится, можно расшириться на PICO. А еще в след году обещают выпустить мобильную гарнитуру Samsung и Steam.

Поэтому запускаю Unreal Engine 5.5.3 и выбираю:

проект Blank,
C++,
Target Platform: Mobile,
Quality Preset: Maximum

-2

Добавляем плагины MetaXR, MetaXRAudio с сайта:

https://developers.meta.com/horizon/downloads/package/unreal-engine-5-integration/

Meta XR Audio SDK Unreal

Листай ниже если не хочешь компилировать под UE 5.5

MetaXRAudio компилируем под версию Unreal Engine 5.5 (если используете 5.4, то ничего делать не надо)
Инструкция по компиляции плагина под движок -
https://developers.meta.com/horizon/documentation/unreal/meta-xr-audio-sdk-unreal-req-setup/#repackaing-for-a-different-version-of-unreal-engine
Помещаем их в папку

-3

Добавил папку Android из плагина версии 5.4, без него билд не собирался

-4

Скомпилированные плагины для Unreal Engine 5.5

Можно скачать MetaXR audio скомпилированный мной - https://drive.google.com/drive/folders/1CqixHao8yEvJhiO8BVgK8VKhBeg6Zj4m?usp=sharing

и сразу активируем его.

-5

В папке проекта создаем папку Build (для билдов).

-6

Создаем .gitignore для системы контроля версий (если у вас установлен Git), внутри может быть минимальный набор ограничений для Git:

.idea
.vs
*.sln
DerivedDataCache/
Intermediate/
Saved/
Binaries/
Build/

Настроим Meta XR Audio:

-7

Справочные материалы для Meta Quest и Настройки Rendering для Mobile графики выбранные мной (не тестировал на сложных сценах).

Хочется еще подобрать настройки для ПК версии, но пока нет времени.

Описание всех настроек Rendering в Unreal Engine:

Rendering Settings in the Unreal Engine Project Settings | Unreal Engine 5.5 Documentation | Epic Developer Community
Graphics Optimization for VR Architectural Visualization -
VR Performance Features | Unreal Engine 4.27 Documentation | Epic Developer Community
Developer Insights: How to Develop with Vulkan for Mobile VR Rendering

https://developers.meta.com/horizon/blog/pc-rendering-techniques-to-avoid-when-developing-for-mobile-vr/

Using the Android Vulkan Mobile Renderer in Unreal Engine | Unreal Engine 5.4 Documentation | Epic Developer Community

[По желанию при отладке уровня] можно добавить в [/Script/Engine.RendererSettings] r.Streaming.PoolSize = 500

такое значение описано как рекомендуемое для Meta Quest (300-500 mb)
О пуле потоковой передачи текстур:

https://dev.epicgames.com/community/learning/knowledge-base/a3vO/unreal-engine-why-is-my-texture-streaming-pool-giving-me-a-warning

НЕ ИСПОЛЬЗУЙТЕ MOBILE HDR и MOBILE MULTI VIEW вместе! При движении камеры это вызывает ошибки рендеринга. В итоге я отказался от MOBILE HDR. Пример ошибки рендеринга в видео:

рутуб:

Ошибка рендеринга

ютуб:

Дополнительно составил список с описаниями моих настроек на которых успешно собирается билд для apk, возможно будет редактироваться в будущем:

https://8bitsage.gitbook.io/8bitsage-wiki/rendering_for_meta_quest

Путь - [YourProject]/Config/DefaultEngine.ini

[/Script/Engine.RendererSettings]
r.Mobile.ShadingPath = 0
r.Mobile.AllowDeferredShadingOpenGL = False
r.Mobile.SupportGPUScene = True
r.Mobile.AntiAliasing = 3
r.Mobile.FloatPrecisionMode = 0
r.Mobile.AllowDitheredLODTransition = False
r.Mobile.VirtualTextures = False
r.DiscardUnusedQuality = True
r.AllowOcclusionQueries = False
r.MinScreenRadiusForLights = 0.050000
r.MinScreenRadiusForDepthPrepass = 0.050000
r.PrecomputedVisibilityWarning = False
r.TextureStreaming = True
Compat.UseDXT5NormalMaps = False
r.VirtualTextures = False
r.VT.EnableAutoImport = False
r.VirtualTexturedLightmaps = False
r.VT.AnisotropicFiltering = False
bEnableVirtualTextureOpacityMask = False
bEnableVirtualTexturePostProcessing = False
r.VT.TileSize = 128
r.VT.TileBorderSize = 4
r.vt.FeedbackFactor = 16
r.MeshPaintVirtualTexture.TileSize = 32
r.MeshPaintVirtualTexture.TileBorderSize = 2
r.MeshPaintVirtualTexture.UseCompression = False
r.StaticMesh.DefaultMeshPaintTextureSupport = False
r.MeshPaintVirtualTexture.DefaultTexelsPerVertex = 4
r.MeshPaintVirtualTexture.MaxTextureSize = 4096
r.vt.rvt.EnableBaseColor = True
r.vt.rvt.EnableBaseColorRoughness = True
r.vt.rvt.EnableBaseColorSpecular = True
r.vt.rvt.EnableMask4 = True
r.vt.rvt.EnableWorldHeight = True
r.vt.rvt.EnableDisplacement = True
r.vt.rvt.HighQualityPerPixelHeight = True
WorkingColorSpaceChoice = sRGB
RedChromaticityCoordinate = (X=0.640000,Y=0.330000)
GreenChromaticityCoordinate = (X=0.300000,Y=0.600000)
BlueChromaticityCoordinate = (X=0.150000,Y=0.060000)
WhiteChromaticityCoordinate = (X=0.312700,Y=0.329000)
r.LegacyLuminanceFactors = False
r.ClearCoatNormal = False
r.DynamicGlobalIlluminationMethod = 0
r.ReflectionMethod = 0
r.ReflectionCaptureResolution = 128
r.ReflectionEnvironmentLightmapMixBasedOnRoughness = True
r.Lumen.HardwareRayTracing = False
r.Lumen.HardwareRayTracing.LightingMode = 0
r.Lumen.TranslucencyReflections.FrontLayer.EnableForProject = False
r.Lumen.TraceMeshSDFs = 1
r.Lumen.ScreenTracingSource = 0
r.Lumen.Reflections.HardwareRayTracing.Translucent.Refraction.EnableForProject
= False
r.MegaLights.EnableForProject = False
r.RayTracing.Shadows = False
r.Shadow\.Virtual.Enable = 0
r.RayTracing = False
r.RayTracing.UseTextureLod = False
r.PathTracing = False
r.GenerateMeshDistanceFields = False
r.DistanceFields.DefaultVoxelDensity = 0.200000
r.Nanite.ProjectEnabled = False
r.AllowStaticLighting = True
r.NormalMapsForStaticLighting = True
r.ForwardShading = True
r.VertexFoggingForOpaque = False
r.SeparateTranslucency = False
r.TranslucentSortPolicy = 0
TranslucentSortAxis = (X=0.000000,Y=-1.000000,Z=0.000000)
r.LocalFogVolume.ApplyOnTranslucent = False
xr.VRS.FoveationLevel = 3
xr.VRS.DynamicFoveation = False
r.CustomDepth = 1
r.CustomDepthTemporalAAJitter = False
r.PostProcessing.PropagateAlpha = False
r.Deferred.SupportPrimitiveAlphaHoldout = False
r.DefaultFeature.Bloom = True
r.DefaultFeature.AmbientOcclusion = False
r.DefaultFeature.AmbientOcclusionStaticFraction = False
r.DefaultFeature.AutoExposure = False
r.DefaultFeature.AutoExposure.Method = 2
r.DefaultFeature.AutoExposure.Bias = 1.000000
r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange = True
r.DefaultFeature.LocalExposure.HighlightContrastScale = 0.800000
r.DefaultFeature.LocalExposure.ShadowContrastScale = 0.800000
r.DefaultFeature.MotionBlur = False
r.DefaultFeature.LensFlare = False
r.AntiAliasingMethod = 0
r.TemporalAA.Upsampling = False
r.MSAACount = 4
r.DefaultFeature.LightUnits = 1
r.DefaultBackBufferPixelFormat = 4
r.ScreenPercentage.Default = 100.000000
r.ScreenPercentage.Default.Desktop.Mode = 1
r.ScreenPercentage.Default.Mobile.Mode = 0
r.ScreenPercentage.Default.VR.Mode = 0
r.ScreenPercentage.Default.PathTracer.Mode = 0
r.Shadow\.UnbuiltPreviewInGame = False
r.StencilForLODDither = False
r.EarlyZPass = 3
r.EarlyZPassOnlyMaterialMasking = False
r.Shadow\.CSMCaching = True
r.DBuffer = False
r.ClearSceneMethod = 1
r.VelocityOutputPass = 0
r.Velocity.EnableVertexDeformation = 2
r.SelectiveBasePassOutputs = False
bDefaultParticleCutouts = False
fx.GPUSimulationTextureSizeX = 1024
fx.GPUSimulationTextureSizeY = 1024
r.AllowGlobalClipPlane = False
r.GBufferFormat = 1
r.MorphTarget.Mode = True
r.MorphTarget.MaxBlendWeight = 5.000000
r.SupportSkyAtmosphere = True
r.SupportSkyAtmosphereAffectsHeightFog = True
r.SupportExpFogMatchesVolumetricFog = False
r.SupportLocalFogVolumes = True
r.SupportCloudShadowOnForwardLitTranslucent = False
r.LightFunctionAtlas.Format = 0
r.VolumetricFog.LightFunction = False
r.Deferred.UsesLightFunctionAtlas = False
r.SingleLayerWater.UsesLightFunctionAtlas = False
r.Translucent.UsesLightFunctionAtlas = False
r.Translucent.UsesIESProfiles = False
r.Translucent.UsesRectLights = False
r.GPUCrashDebugging = False
vr.InstancedStereo = True
r.MobileHDR = False
vr.MobileMultiView = True
r.Mobile.UseHWsRGBEncoding = True
vr.RoundRobinOcclusion = False
r.MeshStreaming = False
r.HeterogeneousVolumes = False
r.HeterogeneousVolumes.Shadows = False
r.Translucency.HeterogeneousVolumes = False
r.WireframeCullThreshold = 5.000000
r.SupportStationarySkylight = True
r.SupportLowQualityLightmaps = True
r.SupportPointLightWholeSceneShadows = True
r.Shadow\.TranslucentPerObject.ProjectEnabled = False
r.Water.SingleLayerWater.SupportCloudShadow = False
r.Substrate = False
r.Substrate.OpaqueMaterialRoughRefraction = True
r.Refraction.Blur = True
r.Substrate.Debug.AdvancedVisualizationShaders = False
r.Material.RoughDiffuse = False
r.Material.EnergyConservation = False
r.Material.DefaultAutoMaterialUsage = True
r.OIT.SortedPixels = False
r.HairStrands.LODMode = False
r.SkinCache.CompileShaders = True
r.VRS.Support = True
r.SkinCache.SkipCompilingGPUSkinVF = False
r.SkinCache.DefaultBehavior = 1
r.SkinCache.SceneMemoryLimitInMB = 128.000000
r.Mobile.EnableStaticAndCSMShadowReceivers = False
r.Mobile.EnableMovableLightCSMShaderCulling = True
r.Mobile.Forward.EnableLocalLights = 1
r.Mobile.Forward.EnableClusteredReflections = False
r.Mobile.AllowDistanceFieldShadows = False
r.Mobile.EnableMovableSpotlightsShadow = False
r.GPUSkin.Support16BitBoneIndex = False
r.GPUSkin.Limit2BoneInfluences = False
r.SupportDepthOnlyIndexBuffers = False
r.SupportReversedIndexBuffers = False
r.Mobile.AmbientOcclusion = False
r.Mobile.DBuffer = False
r.GPUSkin.UnlimitedBoneInfluences = False
r.GPUSkin.AlwaysUseDeformerForUnlimitedBoneInfluences = False
r.GPUSkin.UnlimitedBoneInfluencesThreshold = 8
DefaultBoneInfluenceLimit = (Default=0,PerPlatform=())
MaxSkinBones = (Default=65536,PerPlatform=(("Mobile", 256)))
r.Mobile.PlanarReflectionMode = 0
r.Mobile.ScreenSpaceReflections = False
r.Mobile.SupportsGen4TAA = False
bStreamSkeletalMeshLODs = (Default=False,PerPlatform=())
bDiscardSkeletalMeshOptionalLODs = (Default=False,PerPlatform=())
VisualizeCalibrationColorMaterialPath =
/Engine/EngineMaterials/PPM\_DefaultCalibrationColor.PPM\_DefaultCalibrationColor
VisualizeCalibrationCustomMaterialPath = None
VisualizeCalibrationGrayscaleMaterialPath =
/Engine/EngineMaterials/PPM\_DefaultCalibrationGrayscale.PPM\_DefaultCalibrationGrayscale
r.AllowGlobalClipPlane = False

Прописываем Описание проекта в настройках, чтобы эта запись была внутри каждого .h файла. Она будет уникальна для Вашего проекта.

-8

С такими настройками мне успешно удалось собрать apk для Meta Quest и запустить его на шлеме.

Телеграм канал Unreal Engine VR

Поддержать канал