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

上一篇讲了TBDR的实现,本篇继续讲解deferred rendering层的一些重要改进。

切换到ESM

原先deferred系统用的是VSM,现在切换到开销更小的ESM。具体参见我之前的一篇文章。用ESM之后只需要一个通道,空间占用减少,性能也有所提升。下个版本会进一步改成支持打包到RGBA8的纹理,让不支持浮点纹理的硬件也可以使用ESM。

Multi-resolution层

KlayGE很早就引入了multi-resolution的概念,用来加速SIL的GI。但原先的MR、SIL和Deferred绑在了一起。从上一版开始,MRSIL从Deferred独立出来之后,这个版本继续改进,把MR和SIL也分开了。现在MR可以用于其他地方,比如SSGI。原本SSVO也打算上MR,但后来来不及改了。

这个分离的思路是,MR层负责维护多层的分离和合并,而至于具体在每一层上做什么操作,由使用MR层的组件决定。这么一来,理论上甚至连Deferred都可以用MR来加速。

忽略小物体

去年,Gameloft的大牛凃鸣就提议过对于小物体应该在一些渲染的情况下忽略掉,并且找到了快速计算AABB投影面积的方法。这个版本也作了这样的改进,通过AABB的投影面积作判断,小于一个threshold就不放入渲染队列。这个threshold是以不影响可见效果来调整的。目前只有生成shadow map的时候threshold > 0,其他时候还是保守地设置为0。

Resizer

在很多平台上,窗口大小是不由程序控制的。这个时候如果希望保持统一的输出大小,就需要一个放缩。所以这个版本在流水线的末端增加了resize一步。前不久我也专门写过一个介绍放缩的文章,里面有关于resizer的细节。以后有可能进一步发展成支持dynamic resolution的放缩。

关于deferred的改进就讲到这里,下一篇将讲高质量的地形渲染。