使用Gems II中提到的Interlocking Tiles实现LOD固然很快,但是它无法处理多层贴图,这是skull兄不久前在dreams兄的blog上的一段回复。
Interlocking Tiles的所有Tiles共享同一组index buffer,这是它节省内存的地方,也是它无法绘制多层贴图的主要原因。假设我们有一组贴图,分别为贴图1、贴图2…那么对于贴图1而言,并非所有的三角形中都含有它的成分,所以我们画了大量多余的三角形。
在生成interlocking tiles系统的多级index buffer时,我们仅仅考虑了相机与tile之间的距离这一个因素,现在,我们要把多层贴图这个因素考虑进去。
假设用ROAM
在初始化的时候,我们需要统计好每个非叶结点(这个时候把每个tile当成一棵最大的满二叉树,即分割到底)下所有子结点包含的顶点对于每层贴图的信息,这个用来决定是否继续分割。在渲染的时候,我们要用那三个参数(高度差,摄像机距离,贴图统计)来生成每层贴图的分割树,之后选择一棵(为了防止tile内部的裂缝,我们必须用同一棵树)来渲染,我们也可以对前一层贴图生成的树进行继续分割,这样可以保证最后得到的树对于每一层贴图都足够细致。
接下来我们画三角形,渲染的时候的循环是for each 贴图,我们只检查所有的叶结点,如果三角形的三个顶点当中包含该层贴图我们就画,否则不画。
渲染的时候我打算用单独一个流来保存alpha值,需要一提的是,渲染时候使用的alpha和我们习惯的混合度不一样,由于blend的顺序是依次进行,所以第一个贴图的权重最小,最后一个贴图的权重最大。
假设我们按照从上到下的顺序找出所有alpha不为0的贴图,比方说:
20%
20%
50%
10%(相加100%)
我们可以递推出渲染时候的alpha为:
1
0.5
5/9
0.1
注意:第一层定为100%,最后一层的值保持不变。

最后说一下,roam的确有点慢,可以的话还是要生成静态的index。