RayTracing 下 SkinCache 显存 优化

[5.6 [Content removed]

我们也遇到了一样的问题,不过我们的 SW Lumen 方案下,SkeletalMesh 是不需要 SkinCache 的。但是开启了 HWRT​ 之后,不仅 RayTracing 生成了一份 SkinCache 数据,光栅化的 SkeletalMesh 也生成了 SkinCache 数据,渲染的方式也发生了变化。

我们发现 开启 HWRT 之后,GPU SkinCache 是 全局开启的。

如果在开启HWRT后,删除光栅化的 GPU SkinCache 数据与相关流程,还原到普通的光栅化,但保留 RayTracing 的 GPU SkinCache。这样会有什么问题,是否有相关的优化计划。

重现步骤

Hi,

你好,我的理解,因为RT是需要做SkinCache的,并且多个MeshPass利用SkinCache的结果,可以避免多次做GPU Skinning,理论上是更优的。如果是没有开RT的Mesh,同时也不想他做SkinCache的计算,可以试试r.SkinCache.DefaultBehavior=0,这样应该就不会默认用SkinCache了。

有几个优化的方法,你看看是否有效:

  1. 尽量设置动画更新是 OnlyTickPoseWhenRendered, 这样在动画不更新的情况下,不会重新计算SkinCache
  2. RayTracing用的LODBias(r.Raytracing.Geometry.SkeletalMeshes.LODBias)如果配置过,可能会导致渲染用的LOD跟RayTracing的不一致,导致SkinCache计算两次。
  3. 不需要RT的SkeletalMesh关闭RayTracing。
  4. SkeletalMesh上尽量不勾选RecomputeTangents
  5. 设置r.RayTracing.DynamicGeometry.MaxUpdatePrimitivesPerFrame=10000,减少每帧更新BLAS的每帧更新开销

感谢回答,我这边再次描述一下目前遇到的问题:

  1. 如果调整 RayTracing 用的 LODBias,让其不一致的话,就会产生两份 SkinCache 数据,如果是一致的,会让 BLAS 数据过大(LOD 过小)
  2. 我们希望一个 骨骼网格体,在光追管线下,使用较低面数的 lod 来做 SkinCache 并生成 BVH 数据;Raster 管线下,使用常规的 GPU Skin,关闭 SkinCache。

这样的方案是否可行

Hi,

抱歉回复的晚了。我们代码里是写死的, USkinnedMeshComponent::IsSkinCacheAllowed里,以及bGPUSkinCacheEnabled的赋值。我觉得主要原因是既然Raytracing已经算过SkinCache了,BasePass就尽量复用。不过你们需求也属于合理的。当Raytracing有LODBias的时候,可以保留非Raytracing用的LOD走GPU Skinning。不过目前没用支持。

其实引擎里已经有些地方判断了 bVisibleInRayTracing && RayTracingLODIndex != LODIndex**,**不过没用做这种情况的处理。

可以试试先在USkinnedMeshComponent::IsSkinCacheAllowed里,下面这段代码处,把return true,换成判断RaytracingLOD是否跟LodIdx相同, 如果相同就返回true,如果不同,就继续往下走。

	if (FSkeletalMeshRenderData* SkelMeshRenderData = GetSkinnedAsset()->GetResourceForRendering())
	{
		if (SkelMeshRenderData->bSupportRayTracing && FGPUSkinCache::IsGPUSkinCacheRayTracingSupported(FeatureLevel) && IsRayTracingEnabled())
		{
			return true;
		}
	}