Question: 在虚幻引擎5中,时间超分辨率(TSR)系统如何处理具有非均匀缩放的动态对象的运动向量,以及其实施中可能导致重影伪像的潜在陷阱是什么?
Answer: 虚幻引擎5中的时间超分辨率(TSR)是一种先进的升频技术,利用时间累积从低分辨率输入重建高分辨率帧。它严重依赖运动向量来准确重投影前一帧。对于具有非均匀缩放的动态对象,TSR的处理涉及几个关键机制和潜在问题:
-
运动向量计算:运动向量在顶点着色器或基础通道中按像素计算,通常使用对象的变换矩阵。对于非均匀缩放,运动向量的推导必须考虑对象到世界变换中的缩放因子。公式通常涉及帧间屏幕空间位置的差异,包括缩放在内的完整变换。
- 在代码中,这在着色器如
BasePassPixelShader.usf或MotionVectorPixelShader.usf中处理,其中世界位置使用前一帧和当前帧矩阵进行变换。 - 引擎代码示例片段:
float4 PreviousWorldPos = mul(PreviousFrameTransform, float4(WorldPos, 1.0));后跟投影到屏幕空间。
- 在代码中,这在着色器如
-
重投影和累积:TSR使用这些运动向量重投影前一帧的样本。对于非均匀缩放,如果缩放比例在帧间变化(例如,对象不均匀缩放),运动向量可能无法准确表示像素位移,导致错位。这是因为标准运动向量假设刚体运动;非均匀缩放引入了非线性变换,无法完全捕捉。
-
潜在陷阱和重影伪像:
- 不准确的运动向量:非均匀缩放可能导致运动向量计算错误,如果缩放未正确纳入变换。这会导致前一帧的残留像素未正确对齐,引起重影——对象在后续帧中出现微弱痕迹。
- 错误来源:运动向量计算可能使用简化模型(例如,假设均匀缩放或忽略缩放变化),导致差异。在UE5中,
FMotionVectorSceneProxy和相关着色器尝试处理此问题,但复杂动画可能暴露局限性。 - 代码中的缓解措施:UE5的TSR实现包括基于速度和深度差异拒绝无效样本的启发式方法,但对于非均匀缩放,可能需要额外检查(例如,缩放感知重投影)。
TSR.usf(着色器文件)和C++类如FTSRHistory中的代码处理样本累积和拒绝。 - 相关源路径:关键文件包括
Engine/Shaders/Private/TSR.usf用于着色器逻辑,Engine/Source/Runtime/Renderer/Private/PostProcess/TSR.cpp用于CPU端处理,以及Engine/Source/Runtime/Engine/Private/MotionVectorRendering.cpp用于运动向量生成。
-
调试和优化:为减少重影,开发者可以通过验证渲染线程中的变换更新来确保缩放对象的运动向量准确。使用如可视化运动向量调试视图等工具可以帮助识别问题。
总之,TSR因运动向量计算的固有复杂性而在非均匀缩放方面存在困难,如果在渲染管线中未仔细处理,可能导致重影伪像。深入着色器和C++代码揭示了需要鲁棒变换处理以最小化伪像。
Context: 此问题针对UE5中的高级渲染主题,聚焦于TSR的时间累积及其与对象变换的交互。它适用于涉及图形编程或引擎优化的角色,因为重影伪像是实时渲染中的常见挑战。
