在现在的3D游戏室外场景中大片的茂密草丛为游戏增色不少,是玩家游戏体验真实感的重要组成部分。众所周知,对于象草这样的半透明物体在绘制时需要按到摄像机由远至近的顺序进行排序,否则会出现视觉错误。如果每一帧都对成千上万的草进行排序,CPU开销是极大的,甚至是不可接受的。解决这一问题的方法有三个:
一是只对近处的草进行排序,但在草的密度很大的时候依然有很大的cpu开销。
二是使用alpha test方式进行绘制,从而避免对排序的要求。但这种方法对贴图质量要求极高,稍不注意就会在画面上产生明显的硬边或者镶边现象;
三是通过一些技巧实现快速的绘制排序,既真实放映绘制顺序,又把CPU开销降低到可接受的程度。
下面就介绍我对第三种方案的一种实现方法。首先在我的地形编辑器中草的数据是按地形块Patch组织的,对草的排序就变成两步实现,第一步对包含草的patch排序,第二步对每个patch上的草排序,这样最后只要按patch顺序绘制每个patch上的草就达到了对所有草的排序结果。
这里的关键技巧在于对patch上的草进行排序并不是每一帧都做,也不是严格按照到摄像机的距离来做,而是根据摄像机相对patch所在的位置选择+x、-x、+z、-z四个方向之一进行排序。只有当摄像机相对于一个patch从一个象限运动到另一个象限时才需要对这个patch上的草进行排序。当摄像机连续运动的时候,对于一个特定的patch这种象限的变化很久才会发生一次,而且patch离摄像机越远,这种变化越慢。并且摄像机对可视区域内所有patch的象限变化并不是同时发生的,而是均匀分散在摄像机的运动过程中的,因此每一帧需要排序的patch是很少的,极大的降低了cpu开销。下面是参考图和效果对比图,对比图分别是同一视角没有排序和排序后的效果。