在mobile管线下,USkeletalMeshComponent组件使用GPUSkinCache的情况下。
CollectPSOPrecacheData 里收集的 FRHIVertexDeclaration的PrecachePSOHash与渲染用到的FRHIVertexDeclaration的PrecachePSOHash的不同,结果导致以下PSO missed
[Image Removed]经过代码跟踪调试,发现开启gpuskincache后,会创建GPUSkinPassthroughVertexFactory,并且会改写切线的数据宽度,创建新的顶点声明用于渲染,和PrecachePSO阶段的顶点声明不同。
[Image Removed]按道理说,psoprecache时候的顶点申明逻辑 和实际渲染创建顶点申明逻辑是对齐的情况下,不会造成miss,但是现在这种逻辑的差距导致了miss
请问,是否是引擎bug还是使用上面有什么不对的地方?
Liu.Wei
(Liu.Wei)
2
Hi,
这是因为FGPUSkinPassthroughVertexFactory::GetVertexElements返回的VertexElements实际上是来自于Mesh,但是GPUSkinCache开了之后,实际的顶点格式会在FGPUSkinPassthroughVertexFactory::InitRHI里做修改,两边对不上。
最简单的办法可以试试在调用FGPUSkinPassthroughVertexFactory::GetVertexElements后,添加
VertexElements[1].Type = VET_Short4N; VertexElements[1].Stride = 16; VertexElements[2].Type = VET_Short4N; VertexElements[2].Stride = 16; VertexElements[2].Offset = 8; VertexElements[8].Type = VET_Float3; VertexElements[8].Stride = 12;
然后看一下是否有效。