UE 知识卡片TSRMotion Vectors
TSR 与非均匀缩放
时间超分辨率依赖运动向量重投影;非均匀缩放如何打破刚体假设并制造重影。
Question
UE5 的 TSR 如何处理具有非均匀缩放的动态对象运动向量?实施中可能导致重影伪像的潜在陷阱是什么?
一句话结论
TSR 用运动向量把历史帧样本重投影到当前帧。标准运动向量更擅长刚体变换;非均匀缩放引入非线性位移,向量一偏,历史残影就变成重影。
输入低分辨率帧 + 运动向量
关键步按向量重投影历史样本并累积
脆弱点缩放变化 / 非刚体导致向量失真
防护速度/深度启发式拒绝坏样本
运动向量怎么来
通常在顶点着色或 BasePass 按像素计算:用上一帧与当前帧完整变换(含缩放)把世界位置投到屏幕空间,取差分。
float4 PreviousWorldPos = mul(PreviousFrameTransform, float4(WorldPos, 1.0));
// 再投影到屏幕空间,与当前像素位置作差得到 motion vector
相关着色:BasePassPixelShader.usf、MotionVectorPixelShader.usf。
为何非均匀缩放容易重影
- 帧间缩放变化时,像素位移不再是简单刚体平移/旋转;
- 若实现用了简化模型(假定均匀缩放或忽略缩放变化),向量会偏;
- 历史帧残留未对齐 → 对象拖尾/重影。
陷阱:
FMotionVectorSceneProxy 与相关着色会尽量处理,但复杂动画仍可能露出缝。TSR 侧靠速度/深度差拒绝无效样本,对缩放感知重投影并不总是足够。
源码锚点
| 路径 | 角色 |
|---|---|
Engine/Shaders/Private/TSR.usf | TSR 着色逻辑 |
.../PostProcess/TSR.cpp | CPU 端处理 / history |
.../MotionVectorRendering.cpp | 运动向量生成 |
调试建议
- 确认渲染线程上缩放对象的变换更新完整、及时;
- 打开运动向量可视化,核对缩放变化帧是否出现异常向量场;
- 对比关闭/降低 TSR 历史累积,确认是否为时间重投影问题。