前提是这样的:
我们用Spline做了程序化蓝图方便搭建场景,会在构造函数中通过Spline的相关接口来设置实例的Transform信息。
最近部分美术更换了机器,CPU从Intel换成了AMD,导致原先在Intel设备烘培的蓝图Lightmap信息在AMD设备上丢失了。
目前确定如果限制在蓝图构造函数里设置的Location精度(比如限制到小数点后4位),重新烘培的结果在两种设备上就都能正常。
想问下是否有什么Spline的设置可以规避这个问题?或是lightmap判定valid时能否做下数值精度的处理?
因为目前美术场景的量比较多,全部重新烘培的代价太大,美术方面无法接受。
[Attachment Removed]
Liu.Wei
(Liu.Wei)
2
Hi,
你好,类似的情况的确遇到过,当时的情况是Windows平台烘培出来的Lightmap,在Mac上失效,主要原因是我们的LightmapUV是存在DDC里的,会重新生成,不同平台因为浮点精度造成生成的LightmapUV layout不同。可以考虑把编译器都统一换成clang,或者在VCToolChain.cs把Arguments.Add(“/fp:fast”) 换成 Arguments.Add("/fp:precise ")试试。
[Content removed]
[Attachment Removed]
hi,
和团队里负责这部分的程序讨论了下,我们构建引擎的机器是固定的,美术是直接使用构建好的引擎,理论上应该不会产生这个差异。还是说烘培时也会触发这部分逻辑?
我目前有个想法不确定是否可行:目前看起来有点像是精度问题,物体被认为偏离了烘培时的位置。那我能否在判定烘培是否失效的地方对坐标精度做下限制,比如小数点后4位之前的数值相同就认为位置没有变化。
[Attachment Removed]
Liu.Wei
(Liu.Wei)
4
因为LightmapUV是否要重新生成,主要是看StaticMesh DDCkey是否发生了变化,如果构建的机器跟美术能共享DDC数据,那应该不会触发重新生成的逻辑。如果DDC是Local的,每台设备会自己生成DDC,但一般情况下,如果构建机跟美术的配置环境一致,结果应该一样才对。(至少我没有见过都是windows设备,产生的lightmapuv不同)。
我目前有个想法不确定是否可行:目前看起来有点像是精度问题,物体被认为偏离了烘培时的位置。那我能否在判定烘培是否失效的地方对坐标精度做下限制,比如小数点后4位之前的数值相同就认为位置没有变化。
你是说Lightmap的位置发生了错位? 比如一个物体的影子,不在物体正下方,有一个偏移,这种情况我不太确定,感觉可能性会比较小,能否截一些对比图?
在Position距离中心点非常远的地方,是有可能出现精度误差。不过这种情况我没有见过,所以暂时想象不出误差量能有多大。
[Attachment Removed]
Liu.Wei
(Liu.Wei)
6
Hi,
所以这个问题是Lightmap丢失了,不是错位了,是吗?
如果是的话,能否debug一下,在UStaticMeshComponent.GetMeshMapBuildData 里,看一下对应的mesh是否能找到对应的MapBuildData。我暂时没有想到为什么跟坐标的精度有关系。
[Attachment Removed]
[Image Removed]抱歉之前描述有误,确实是丢了不是错位。
断点看发现BuildRenderData时LODData数据为空了,没执行GetMeshMapBuildData函数。
[Attachment Removed]
Liu.Wei
(Liu.Wei)
8
Hi,
暂时不太确定为什么LODData是空,能否debug一下?正常在Seralize后应该是有效的。
[Attachment Removed]
好的,我这边刚好找到个本地可复现的案例,回头debug一下看看
[Attachment Removed]
Liu.Wei
(Liu.Wei)
10
好的,如果案例足够简单,也可以发上来,我可以一起查一下。
[Attachment Removed]
不好意思最近比较忙,刚顾上看。
目前只定位到serialize时没有读取到LODData数据,SerializeNum为0(在正常的机器上是非0)。案例由于关联了很多项目在引擎上的自定义改动,在官方引擎下无法正常显示,所以没法上传让你一起帮忙排查。
[Image Removed]
[Attachment Removed]
Liu.Wei
(Liu.Wei)
12
序列化出来的结果不一致有点奇怪,暂时不确定可能的原因,如果你那里有更多线索,我们在一起讨论一下。
[Attachment Removed]
目前没有什么思路,由于只有通过spline获取坐标的物体才有这个问题,和美术商量了下打算针对Spline的位移旋转返回接口扩展个参数来限制精度。
[Attachment Removed]
Liu.Wei
(Liu.Wei)
14
好的,如果我们后续发现有类似的问题,我再跟你们同步。
[Attachment Removed]
[Image Removed]你好,这两天发现个问题,保存MapBuildDataId的LODData标记了transient,应该是不序列化的,那这个数据的来源是哪里呢?没搞懂这个数据的初始化流程。
[Image Removed]ApplyComponentInstanceData时是正常匹配成功的,但是CachedStaticLighting.MapBuildDataIds数据的来源又是标记为临时变量的LODData
顺便补充一些信息,旧烘培用机器是i7_8700k + win10,新机器是13代intel和AMD + win11,不确定会不会系统windows系统有关。
[Attachment Removed]
Liu.Wei
(Liu.Wei)
17
MapbuildData不是存在StaticMesh上的,而是存在Map里的(有个MapBuildData的文件),不是序列化的问题。我暂时没有太多头绪,第一次见到window上出现这种情况。
[Attachment Removed]
我这边只能确定通过Spline得到的部分Instance坐标从小数点后4位有差异,导致StaticMeshComponent的LODData加载不到。
由于目前我们的硬件和系统都是统一的了,所以还是决定选择最轻量的处理方式,从蓝图层面去规避。
后续如果你们也没有新进展就可以关闭这个问题了,感谢最近的帮助~
[Attachment Removed]