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

KlayGE 4.0确定了Deferred Rendering的框架以来,每个版本都有一些小改进。在正在开发的4.3里,多个改进经过这几个版本的融会贯通,产生了一些新的变化。这里做个系列总结一下。

GI和Deferred的分离

最早提到这个问题的是团队成员陈顺斌。他在去年就提出Deferred rendering layer太过复杂,应该把相对独立的GI拆出去。当时我的想法是,Deferred和MRSIL GI(Multiresolution splatting for indirect lighting)在逻辑上关联甚大,应该是一体的。后来实现了SSGI,也放在Deferred框架内,复杂度进一步增加。Deferred也成了个带有多种GI方法的怪物,各个组件之间的耦合度很高。

在分析了MRSIL、SSGI以及未来可能支持的SVO等多种GI方法之后,我发现如果定义好一个接口,那么要将两者分离是有可能的。

这个接口包括两方面,第一是GI从Deferred拿到的数据,第二是GI计算的结果返回给Deferred。从目前的实现来看,GI的计算需要G-Buffer和RSM,计算的结果是一个半分辨率的indirect texture。从半分辨率indirect texture得到全分辨率的步骤在Deferred里面做。用这样的抽象接口就能顺利实现GI和Deferred的解耦。最终结果是,写了一个称为IndirectLightingLayer的抽象类,MSRIL和SSGI都从它派生出来。这么一来,Deferred只需要调用接口,提供所需数据,取出计算结果,而不需要考虑GI的具体实现。简单了很多。

Indirect Lighting Layer

需要特别说明的是,SSGI目前虽然不需要RSM,但不排除以后能用上。所以在接口中总是把RSM传过去。

未来

Multiresolution的框架也许也可以从GI的具体实现中分离出来,使得不同的GI方法,以及SSVO甚至direct lighting都可以使用的加速结构。这件事情要等到以后慢慢尝试了。

通过GI的解耦,Deferred框架已经得到了一次瘦身。下一篇还将专注于Deferred框架的性能改进上。