地形渲染作为室外游戏必备的功能,已经有很多成熟的LOD和Shading的算法,LOD的种类非常多,但基本都是那几种LOD的变种,技术也很成熟,一般来说好的游戏的LOD技术一定不会差。换句话说LOD不会是游戏渲染的瓶颈,地形很多时候是占屏幕像素最多的集合体,大部分地形都是通过分块也就是sector来渲染的,离camera最近的几个sector往往是像素贡献大户,很多时候离camera最近的4个sector会占到整个地形的一般渲染时间,原因就是因为像素多,而且Materlal LOD采用的是最复杂的。游戏里地形的Materal用的最多的就是多层贴图通过一张blend map进行加权混合级Texture Composite.
这个Compsite混合的层数越多,shader越复杂计算量越大,在游戏里大多采用5层贴图进行混合,加上法线贴图就需要sample 11次(5次 diffuse,5次 normal,一次blend map),如果有specular的话还需要再采5次specular,可见这是一个很费的操作,雪上加霜的是离得近的sector的像素非常多,这导致GPU时间消耗的非常多。
Intel的这个方法就是为了降低地形的shader复杂度,(像素数目是没办法减少的),通过将Sector渲染到一张buffer上,然后画地形近处sector的时候只需要采一个diffuse和normal这样11个sample就变成了2个(因为blend map也不需要采了),这样可以极大的降低texture sample同时可以减少GPR的数目从而增加GPU并行线程。这可以很大程度的提高近处sector的性能。红色区域采用的就是Pre-Compositing Textures。从Intel的场景来看可以提升整体GPU 20%的性能,对于这个sector性能提升了48%(估计是极限了,即便是画一个quad采一个贴图的性能也不过如此)
前面只是简单的对于一个secto来说怎么实现这个优化,对于真实场景还需要考虑camera动起来的情况,camera一旦动起来,移动的距离超过一定阈值就需要对当前camera附近的sector更新,这里更新的是camera附近的9个sector。
这些被Pre-Composting的texture的格式是rgba8,会占很多显存,Intel采用实时的压缩方式将这些贴图压缩成DXT,大大的节省了显存和内存的消耗,但是也需要付出一些CPU消耗,如果有足够的CPU时间用这个方法还是挺好的。
当然这个方法也不是万能的,在性能方面的确可以有很大帮助,但是额外的显存内存以及CPU时间会让这个技术受到很多限制,因为游戏里各种资源都是很宝贵的,所以要权衡,根据实际情况来决定这个技术是不是真的适合你的游戏;还有另一个缺陷是现在很多地形都考虑了抗拉伸(uv distortion),采用这个方法就无法支持抗拉伸了,因为这个方法只采了一次贴图,而且uv是不均匀的无法做到抗拉伸。但是无论如何,这个方法的思路非常不错,也许有一天这个思路用在别的方法上可以达到不俗的效果。