上一回我们说到Cluster Based Lighting,将摄像机空间切成块,使每一块棱台都保持有一个自己的光照队列,这样的光照剔除方法有非常多的好处,其中最主要的好处在于其鲁棒性高,比如既能支持Forward Pipeline,也可以支持Deferred Pipeline,无论是气体渲染,液体渲染,透明固体渲染,粒子渲染等,都可以通过一个世界坐标获取到当前的受光信息。但是仅仅如此是不够的,因为Cluster Based Lighting也有其局限性,其中最致命的局限在于其光照剔除精度的不足。因为不依赖深度,所以在切割的时候必须将空间的Z轴切割成多段,譬如在MPipeline中,我们按照非线性近小远大的规则将空间的Z轴切割成64份,因此在同样的切割解析度下,其剔除消耗将会是TBDR的64倍。最终的结果就是光照的剔除精度必须做妥协,因此我们的XY轴切割解析度就大大的降低了,降低到了16 * 8。很显然,将屏幕横竖分为16 * 8这样的剔除精度是远远不够的,因此我们需要专门为光照运算的主要部分,也就是延迟管线渲染的物体做一个单独的TBDR。
光照的剔除方法一般要考虑需求场景的目标光源的大致数量,而我们这里场景管理考虑的是,在到摄像机裁面的一定距离内,如128米,192米或256米等,使用实时的灯光,即支持阴影,高光,物理衰减等高级光照运算。而超出一定距离后则使用LOD的切换,换成Light Volume直接使用GBuffer进行叠色,据悉GTAV使用的光照计算方法就是这样的: