只接触过 FSR3 插帧,可以跟你分享下大概思路
1. 基本逻辑,跟你说的差不多,用速度把图 A 、结果图 Result 和图 B 中的一点 p 关联起来,取这些位置的颜色 c_A ,c_B ,然后根据一定规则把这些颜色混合起来 c_Result = mix_function(c_A, c_B, params),最后把这个颜色存进 Result 对应的位置。所以关键在于怎么混合
2. 深度怎么用: Depth Clip ,大概目的是对于图 Result 中的一点 p ,算这一点在图 A 和图 B 中的对应点是否能被看见,把这个 vec2(bool)存到一个 mask 里,在混合的时候查询当前点的 DepthClip ,如果在 A 中不可见,那混合的时候就不考虑 A 的贡献,在 B 中不可见则不考虑 B 。
DepthClip 具体怎么算: 重投影深度 D_B 到 Result 时刻,取三个深度 buffer 上对应点的值 D_A, D_B, D_Result (要转进 Camera space),从你图里看应该没有 reverted depth ,那就 DepthClip.invisible_in_A = D_Result - D_A > threshold; DepthClip.invisible_in_B = D_Result - D_B > threshold. 至于这个 threshold 怎么算可以参考这篇文章 (Same as FSR3)
https://www.microsoft.com/en-us/research/publication/minimum-triangle-separation-for-correct-z-buffer-occlusion/3. 有了 Depth Clip 后 Result 画面上会有一些地方同时不能在 A 和 B 中看见(DepthClip=(false,false)),也就是说 c_A 和 c_B 的贡献都会被去除。为了不让这些纯黑影响画面效果,FSR3 还有个填缝机制 (Inpainting)
本质上就是求当前画面的 mip chain (下采样),直到所有缝都被填上为止。然后将这些颜色填进缺失的像素中。
其他细节:
深度重投影 (包括写入 c_Result 本质上也是个重投影) 会出现多像素通过速度指向同一个像素的情况 (竞争), 处理竞争的思路本质上是保证前后遮挡关系,所以取深度较小者写入即可