[5.6 [Content removed]
我们也遇到了一样的问题,不过我们的 SW Lumen 方案下,SkeletalMesh 是不需要 SkinCache 的。但是开启了 HWRT 之后,不仅 RayTracing 生成了一份 SkinCache 数据,光栅化的 SkeletalMesh 也生成了 SkinCache 数据,渲染的方式也发生了变化。
我们发现 开启 HWRT 之后,GPU SkinCache 是 全局开启的。
如果在开启HWRT后,删除光栅化的 GPU SkinCache 数据与相关流程,还原到普通的光栅化,但保留 RayTracing 的 GPU SkinCache。这样会有什么问题,是否有相关的优化计划。
Liu.Wei
(Liu.Wei)
3
Hi,
你好,我的理解,因为RT是需要做SkinCache的,并且多个MeshPass利用SkinCache的结果,可以避免多次做GPU Skinning,理论上是更优的。如果是没有开RT的Mesh,同时也不想他做SkinCache的计算,可以试试r.SkinCache.DefaultBehavior=0,这样应该就不会默认用SkinCache了。
有几个优化的方法,你看看是否有效:
- 尽量设置动画更新是 OnlyTickPoseWhenRendered, 这样在动画不更新的情况下,不会重新计算SkinCache
- RayTracing用的LODBias(r.Raytracing.Geometry.SkeletalMeshes.LODBias)如果配置过,可能会导致渲染用的LOD跟RayTracing的不一致,导致SkinCache计算两次。
- 不需要RT的SkeletalMesh关闭RayTracing。
- SkeletalMesh上尽量不勾选RecomputeTangents
- 设置r.RayTracing.DynamicGeometry.MaxUpdatePrimitivesPerFrame=10000,减少每帧更新BLAS的每帧更新开销
Liu.Wei
(Liu.Wei)
5
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;
}
}