利用残像消除跳动感


注:另有相关文章详细解释了动态模糊推荐阅读, 另11月19日补记:我发现我的文笔实在是差, 而且做插图的水平实在一般. 今天看到一篇对动态模糊 讲解的特别好的文章(并且有合适的插图和动画) 虽然是英文的, 但不难理解. 我的这篇文章屡受攻击. hehe 这次靠别人的东东来平反了. 请看这里啦. 另外, 听说 Q3A 将支持 T-Buffer 技术, 那样的话, 在高档机器上就会有完美的动态模糊表现. 我期待着...

如果你曾经设计过卷轴动作游戏, 就会发现, 当你的背景滚动, 每帧画卷动超两个点后, 即使游戏能达到 60fps 的速度, 仍然会给人一种跳动的感觉. 而我们的电视, 每秒不到 30 帧图象, 却从来没有这种感觉, 这是为什么呢? 这个问题云风思考了很久.

当我想通了后, 发现原理特别的简单. 因为电视中的画面, 在摄像的时候, 被摄的运动物体是连续的. 这样, 每帧图象中实际保存了 1/24 秒以内运动物体的运动过程. 而我们的计算机动画或者说游戏, 每帧画中的图象却是固定的. 这样快速的运动, 人眼感觉不到其中的过程, 自然会觉得跳动.

明白原理后, 我们却很难在计算机上正确的模拟出这个过程. 设想一下, 我们要求游戏有 20fps, 在每帧图里再由物体1/20 秒内每 1/200 秒的状态,共 10 帧的组合, 那么, 计算机需要每秒产生 200 帧图; 而且, 这 10 帧图如何组合? 设想一下, 胶片的感光, 我想应该是一种图象混合. hehe 应该就是用 Alpha 混合来模拟了. 想想这个运算量, 至少在现在, 是无法实现的.

那么我们可以去接近这个效果吗? 答案是可以的 ^_^ 只需要减少其中需要的图象数, 即不在每帧画内记录物体的运动过程, 而是在前后相关帧上体现出物体运动的信息. 这样做的效果虽然不能完全反映电视中的平滑效果, 但是一定程度的缓解了物体大跨度运动 的跳动感 (虽然物体的运动轨迹仍然没有线形记录下来) 这就有点象吴式反混淆点算法, 依靠周围做 Alpha 混合点来体现坐标非整数时的情况.(关于Wu-Pixel详细的描述, 请参看 斜视角图形引擎的设计--轮廓处理一文)

采用这种方法, 物体在小速度运动时,边缘模糊, 真实感加强 :-) 大速度运动, 则出现影子,就像武功高手快速移动的残像效果.

此算法的关键在与整屏幕的高速 Alpha 混合运算, 凡做过这个的朋友都知道其运算量之大, 好在云风找到了比较好的算法做 16bit 高彩模式的 Alpha 混合(另文描述) 使其变为可能. 在风魂游戏程序库即将推出的 0.06 版中, 这个效果将作为一个选项提供, 大家可以先下载这个DEMO(186K) 先睹为快. 由于代码将随风魂 0.06 一起公布,所以这个包里只有演示程序,没有源码.

当然, 等计算机的速度主够每秒处理 300 次全屏 Alpha 混合, 我们可以每 10 次混合生成 一帧图象显示, 那么, 游戏达到电视上的视频动画的流畅度是完全可能的 ^_^

附上 DEMO 的屏幕截图,供懒的下载 DEMO 的朋友研究: (请注意右下角"真"字的轮廓, 和风魂位图带的残像, 可以对我上文中所述有所感性认识)

残像演示 DEMO 的屏幕截图(29,418字节)

上面演示的算法是为了能在目前的机器上实时运算, 有些使用价值, 但效果不尽人意 ;-( 云风另外写了一个预算后的程序展现平滑滚动的效果, 请下载(66k). 这个程序缺省是一次移动 2 个像素点, 您可以用键盘的 1,2,3 调整每次移动点的个数. 使用 A 键加速, Z 键减速, Q 键还原到最高速度. 建议运行时按 1 设置每次移动 1 个像素点, 然后多按几次 Z 键减速, 就可以感觉到处理的方法了 ^_^