转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2137

KlayGE 4.1支持由王清源提供的屏幕空间反射,但由于只是屏幕空间,反射方向就被局限到跟视线相同的方向。在即将发布的KlayGE 4.2中,这个功能被扩展到了支持多个方向,成为了实时的全方向非平面反射。(虽然7月底就已经实现了这个功能,但到现在才有时间整理出demo…)

多方向反射必然需要往不同方向渲染多次场景,而且每一次都必须是带lighting和shading的效果。因此,Deferred rendering layer引入了multi-viewport的功能,只要定义几个不同的viewport,就能同时得到不同视点的场景渲染结果,包括当前帧的RGB/depth,和上一帧的RGB/depth。这个功能不但能用在反射,还能用于分屏显示、多视角显示、缩略图等游戏常见的情景。这样相当于把deferred rendering流水线延展了好几倍,好在一般来说分辨率可以降下来,最终的开销并没有太大。

在这里,理论上可以和传统做实时多方向反射的方法一样,从物体中心渲6次,建立一个cubemap,并索引反射颜色。但因为有了SSR,顺着视线方向的部分就不需要渲染了。同时因为对最终效果贡献最大的是逆着实现的方向,所以这里只需要从物体中心,沿着视线相反的方向渲一次(称为back side camera,从视点出发的称为front side camera)。接着用SSR的跟踪方法,就能得到相当不错的效果。有了multi-viewport的帮助,这个过程变得相当简单灵活。至于没有跟踪到的pixel,就直接取环境cubemap的颜色。示意图如下:

Cameras layout

至于back side camera的选择,偏球形的物体可以选择从物体中心,沿着视线相反的方向。对于偏平面的物体,可以像传统做反射的方法那样,把视点和视线方向求一个镜面反射生成新camera。在实际中,这个方法足够对付大量的室外场景了。

Reflection

因为是SSR跟踪得到的pixel,而不是简单的cubemap映射,恐龙在茶壶上的反射形变更接近真实。同时注意壶嘴和盖子的把还能在茶壶上产生self-reflection。有了这么一套框架,大多数形状的物体反射都能得到较好的解决。