UE 知识卡片TSRMotion Vectors

TSR 与非均匀缩放

时间超分辨率依赖运动向量重投影;非均匀缩放如何打破刚体假设并制造重影。

Question

UE5 的 TSR 如何处理具有非均匀缩放的动态对象运动向量?实施中可能导致重影伪像的潜在陷阱是什么?

一句话结论

TSR 用运动向量把历史帧样本重投影到当前帧。标准运动向量更擅长刚体变换;非均匀缩放引入非线性位移,向量一偏,历史残影就变成重影。

输入低分辨率帧 + 运动向量
关键步按向量重投影历史样本并累积
脆弱点缩放变化 / 非刚体导致向量失真
防护速度/深度启发式拒绝坏样本

运动向量怎么来

通常在顶点着色或 BasePass 按像素计算:用上一帧与当前帧完整变换(含缩放)把世界位置投到屏幕空间,取差分。

float4 PreviousWorldPos = mul(PreviousFrameTransform, float4(WorldPos, 1.0));
// 再投影到屏幕空间,与当前像素位置作差得到 motion vector

相关着色:BasePassPixelShader.usfMotionVectorPixelShader.usf

为何非均匀缩放容易重影

  1. 帧间缩放变化时,像素位移不再是简单刚体平移/旋转;
  2. 若实现用了简化模型(假定均匀缩放或忽略缩放变化),向量会偏;
  3. 历史帧残留未对齐 → 对象拖尾/重影。
陷阱FMotionVectorSceneProxy 与相关着色会尽量处理,但复杂动画仍可能露出缝。TSR 侧靠速度/深度差拒绝无效样本,对缩放感知重投影并不总是足够。

源码锚点

路径角色
Engine/Shaders/Private/TSR.usfTSR 着色逻辑
.../PostProcess/TSR.cppCPU 端处理 / history
.../MotionVectorRendering.cpp运动向量生成

调试建议

  • 确认渲染线程上缩放对象的变换更新完整、及时;
  • 打开运动向量可视化,核对缩放变化帧是否出现异常向量场;
  • 对比关闭/降低 TSR 历史累积,确认是否为时间重投影问题。