最近看了很多地形渲染的文章和代码,发现自己的之前的地形渲染很多思路都是正确的,只是自我怀疑的太厉害,没有深入的完善它。接下来,我觉得自己还是很有必要用一些时间总结一下地形渲染思路。
一般来说,地形分成chunk或者称作tile渲染,一个chunk为9*9的顶点组合,之所以为9*9是因为这样一个index可以用u8来表示,同时可以支持4级lod(如果你需要这么多的话)。一个chunk长度是33.3m,用256*256的贴图表示一个单独的tile,就是说一个tile长度是4.1m。一个像素的长度是1.6cm,这个作为高精度地形应该足够了。不管你是用geomimap还是用ROAM来组织chunk内的顶点结构,那么不同lod之间的chunk连接都要足够注意,我是用index方式渲染的,所以index buffer的枚举数量是跟lod有关系的,而且只需要低级的地形index buffer做变化。比如说3级lod,那么3级的只有一种index buffer;2级的跟1级之间才有变化,可能性有4+6+4+1=15种(不用考虑矩阵变换减少种类);1级的变化最多,有15+15+(2*6+3*4*2+2*2*2*2-2)=80,那么index buffer的内存消耗为96*9*9*1=7776。也就是7k多的数据,是可以接受。
那么我们把每一个chunk作为一个batch来渲染,这里的问题是,如果一个chunk一个batch来的话,那么batch过多对性能是很大的影响,幸好我们通过材质渲染,使相同的chunk可以一起渲染。这里问题最大的还是贴图,贴图的质量直接影响世界地图的效果,这里我采用的是texture spattling技术,WII上面可以用tev stage去做,pc上面支持shader的话,可以用单pass,然后用alpha和shadow map组成一张贴图,进行渲染,如果不支持,就mutipass了。
这里对于贴图的大小,base贴图都是256X256的,细节足够,alpha贴图64*64,shadow map也是。那么也就是说一次要load 5张贴图,4个base和一个blendtexture。wii上面显然不能使用这么多贴图。但是wii上面tevsatate在渲染的时候却不需要变化,也就是不需要重新设置,只需要更改使用的贴图,pc上面也是如此。
这里我们大概计算一下顶点,一千米的地图需要81*1000/33.3=2430个顶点,相当不错。
其实pc上市可以更多的,如果用roam,那么就是(81+64)*30=4xxx,在pc上也是可以接受的。
接下来就是无缝连接的问题,或者说无载入地图渲染。其实当一切分成chunk以后,这些都比较简单了,可以设置一个loadradius和holdradius,loadradius里面的chunk都需要载入,holdradius里面的chunk先不释放,如果没有的,那么载入。这样的话,随着摄像的移动,虽然随时随刻可能都有chunk载入,但是数据量却是可以忽略的!!!!
恩,今天晚上先写这么多,有些东西可能忘了记录,但是重要的应该都记录下来了。下一篇我记录一下关于植被渲染的有些问题。