GPULightmass 烘焙崩溃

启动编辑器时,设置r.RayTracing.EnableOnDemand=1,r.RayTracing.Enable=0。

打开一个关卡,并随意拖入一个含有多级LOD的staticmesh,设置r.RayTracing.Enable=1(一定要先拖入mesh后切换raytracing),并进行烘焙​,

会崩溃在 ensure(RayTracingInstance.GeometryRHI->GetNumSegments() == MeshBatches.Num());

问题在于​ 5.6 默认启用了

r.RayTracing.UseReferenceBasedResidency

会导致​ r.RayTracing.Enable 切换时只加载 ResidentGeometry(即最后一级LOD的数据),而不处理其他LOD的数据,这会导致其他级LOD并不能正确生成GeometryRHI

重现步骤
启动编辑器时,设置r.RayTracing.EnableOnDemand=1,r.RayTracing.Enable=0。

打开一个关卡,并随意拖入一个含有多级LOD的staticmesh,设置r.RayTracing.Enable=1(一定要先拖入mesh后切换raytracing),并进行烘焙​,

会崩溃在 ensure(RayTracingInstance.GeometryRHI->GetNumSegments() == MeshBatches.Num());

问题在于​ 5.6 默认启用了

r.RayTracing.UseReferenceBasedResidency

会导致​ r.RayTracing.Enable 切换时只加载 ResidentGeometry(即最后一级LOD的数据),而不处理其他LOD的数据,这会导致其他级LOD并不能正确生成GeometryRHI

Hi,

你好,我尝试复现这个问题,但是没有复现,你方便提供一个简单的复现蓝图工程吗?

另外RayTracingInstance.GeometryRHI->GetNumSegments的数量好像跟LOD的数量没有关系,所以我想复现之后再分析一下问题。

我意思是

只加载 ResidentGeometry(即最后一级LOD的数据),而不处理其他LOD的数据,这会导致其他级LOD并不能正确生成GeometryRHI

上述这个问题会导致存在多级LOD的物体的前N-1级LOD的GeometryRHI为nullptr,导致ensure(RayTracingInstance.GeometryRHI->GetNumSegments() == MeshBatches.Num())出现问题,

我明天尽量提供一个复现工程,顺便是启动编辑器前在config设置r.RayTracing.EnableOnDemand=1,r.RayTracing.Enable=0。

好的,麻烦了, 我之前是按照你说的流程尝试复现的,但是没有崩溃,不确定是不是我哪里忽略了。

如果我没理解错的话,应该只要场景里默认有一个带lod的staticmesh,然后设置r.Raytracing.Enable 1,然后再build gpu lightmass,应该就会走到ensure的地方。

我更新了一个可复现的项目,可以在最后的log里看见崩溃在了

[2025.07.17-06.56.16:739][601]LogWindows: Error: Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000110

[2025.07.17-06.56.16:739][601]LogWindows: Error:

[2025.07.17-06.56.16:739][601]LogWindows: Error: [Callstack] 0x00007ffb97210090 UnrealEditor-GPULightmass.dll!GPULightmass::FCachedRayTracingSceneData::SetupFromSceneRenderState() [D:\UE5.6\UnrealEngine-release\Engine\Plugins\Experimental\GPULightmass\Source\GPULightmass\Private\LightmapRenderer.cpp:738]

即 ensure(RayTracingInstance.GeometryRHI->GetNumSegments() == MeshBatches.Num());

处。

只需要打开content目录下的testGPULightmassCrash.umap关卡后手动切换下r.RayTracing.Enable=0,然后再 r.RayTracing.Enable=1 再启动烘焙即可(要先打开关卡再输入cvar)

使用的引擎为github上 最新的 5.6.0-release

Hi,

我可以复现这个问题了,不过应该跟ResidentGeometry没关系,看起来应该是Editor的Viewport默认关闭了Realtime,导致没有执行MakeGeometryResident,没有生成RayTracingGeometryRHI,你可以在Viewport右上角”眼睛“旁边的那个按钮,打开Realtime Viewport,然后再开关Raytracing和Build Light。

好的哇,感谢,那目前的没开realtime只会让 GRayTracingNumAlwaysResidentLODs 数量的 LOD makegeometryresident 是认为是一个feature嘛,因为烘焙gpulightmass的时候应该一般默认都不启用realtime吧,毕竟启用和不启用realtime,gpulightmass的烘焙时间是有显著区别的。

嗯嗯,这的确是属于bug,不过目前GPULightmass的维护相对缓慢,我个人感觉可以在文件 \Release-5.6\Engine\Plugins\Experimental\GPULightmass\Source\GPULightmass\Private\Scene\Scene.cpp的FScene::BackgroundTick()函数里,在RenderState.BackgroundTick(RHICmdList);这句的地方,改成

ENQUEUE_RENDER_COMMAND(BackgroundTickRenderThread)( [&RenderState = RenderState, bIsViewportNonRealtime = !FGPULightmassModule::IsRealtimeOn()](FRHICommandListImmediate& RHICmdList) mutable { RenderState.BackgroundTick(RHICmdList); if (bIsViewportNonRealtime) { GRayTracingGeometryManager->Tick(RHICmdList); } });这个文件需要#include “RayTracingGeometryManagerInterface.h”,

试试看是否能解决问题。

好的哇,非常感谢