3D地形编程之GeoMipMap基础(2)
图 5.4 在 Geomipmapping 算法 中,随着图块远离观看者,选择更低的细节级别。 图 5.5 Geomipmapping 白皮书中呈现的作为图块渲染的三角形排列方式。 这种排列可能看起来像是一个比较好的主意,并且它在很多地方使用。 ( 警告:我会在这里稍微转变下话题。 )
图5.4 在Geomipmapping算法中,随着图块远离观看者,选择更低的细节级别。
图5.5 Geomipmapping白皮书中呈现的作为图块渲染的三角形排列方式。
这种排列可能看起来像是一个比较好的主意,并且它在很多地方使用。(警告:我会在这里稍微转变下话题。)如果你计划用顶点缓冲渲染块,三角形带将有明确的传送路线,这是我给你的建议。然而,因为实现顶点缓冲渲染系统对API有非常高的依赖,我选择用直接方式渲染,因为如果有需要的话,这样更容易变换到其他API的语句。用顶点缓冲给渲染提供快捷的速度以增强任何地形实现,因为当你单独的发送每个顶点、纹理坐标、颜色等等给API时它减少当前的函数头。另外,大部分显卡喜欢顶点信息作为顶点缓冲的类型传递。在最后,我劝告你们使用顶点缓冲做为地形渲染。你将得到极大地速度的提升,并且它总有额外的成果值得完成它。如果你想看Geomipmapping用Direct3D顶点缓冲的技术实例,请看“Simplified Terrain Using Interlocking Tiles,”在游戏编程精髓,第2册。
不管怎样,是时候回到主题了。图5.3展示的排列方式是我们渲染图块要用的方式。这种排列提供给我们一个很大的好处:当我们需要的时候它让我们容易的跳过渲染一个顶点,这是非常经常的。它带我进入我们下一个讨论的话题。
砍的痕迹和裂缝,
但通常只是裂缝
经常的当你应对CLOD地形算法时,你必须应付断裂的对象。断裂的发生,在Geomipmapping中,是当高细节的块邻接着低细节块时(看图5.6)。
如同你从图片中所见一样,在左边的块比右边的块的细节级别高。我们的问题位于A、B两个点。这个问题是在A点的左边比在B点的细节级别高。意思是左边的块在A点会渲染精确的高度,但是右边的块只是取高于它和低于它的平均高度。(应该是说左右两边细节级别不同所以高度不同,高级别的那边高度更精确,低级别的这边高度是上下2个邻接顶点的平均值,左右高度不一样就会裂开了。)
图5.6 2个图块,不同的细节级别,并列一起。
这整个“断裂”东西可能似乎没这样大的数量,但是看看图5.7,展示了我没用抗裂痕度量的Geomipmapping实现的效果屏幕截图。
图5.7 没使用反裂痕度量的Geomipmapping实现的屏幕截图。
这不是精确的平滑地面,不是吗?只能在景象中看到裂开的洞。让我们修缮它吧!
断裂试验你的Geomipmapping引擎
断裂试验你的Geomipmapping引擎比听起来容易许多。某人(有可能是我)给你解释这个概念,你就会得到更多的好处,让整个进程如同……一样简单,好吧,某些事情简单。
我有2个可能的选择方法来修缮断裂问题。一个方法是给低数量细节的块增加顶点,这样有问题的顶点将与高细节块的顶点的高度一致。这个解决方法可能很丑陋,尽管如此,这意味着我们需要重新排列块(添加其他的三角形扇面)。
另外个解决问题的方法是删除更多细节块的顶点。这个方法无缝地、轻松地解决断裂问题。看图5.8看这是多么容易的事,简单的删除一个顶点修缮了裂缝。
图5.8 省略渲染A和B2个点的顶点,根除了裂缝。
尔裂缝的艺术在哪里?
你知道裂缝的起因并且知道怎么修缮它们。真正的问题是:你怎么知道什么时候修改它们?在根本上,当你渲染目前的块时,你需要测试这个块周围(看图5.9)以确定它们是否是低细节级别。如果它们是,你就会知道你需要删除一些顶点。
测试每个块不是很困难。你只需要实现一系列简单的if-else声明。(后面显示了伪代码。)
If LeftPatch.LOD is less than CurrentPatch.LOD
RenderLeftVertex= true;
Else
RenderLeftVertex= false;
If RightPatch.LOD is less than CurrentPatch.LOD
RenderRightVertex= true;
Else
RenderRightVertex= false;
If UpperPatch.LOD is less than CurrentPatch.LOD
RenderUpperVertex= true;
Else
RenderUpperVertex= false;
If LowerPatch.LOD is less than CurrentPatch.LOD
RenderLowerPatch.LOD= true;
Else
RenderLowerPatch.LOD= false;
图5.9 邻接的块需要被测试,看它们是否更低LOD。
看到它是多么简单了吧?在测试之后,渲染你的三角形扇面,你跳过较为粗糙的块的顶点。例如,如果右边的块是较粗糙级别的细节,而当前块是高细节级别(多部分的列/行三角形扇面被渲染),这时你只想跳过图块的右边远处的顶点(看图5.10)。
『小心
请小心你移除的只能是有必要的顶点。否则,可能由一个满顶点的图块结束这意味着没移除。例如,在图5.10中,图块由多部分的三角形扇面行和列构成。你不想删除每个扇面的右边顶点;你只想删除最右边列的扇面的右边顶点。』
这就是给你的简单的Geomipmapping理论!现在是时候了,我们实现所有东西,我们刚才学的。
上一篇: 无限级菜单父节点查询所有子节点
下一篇: Locust测试结果信息生成CSV文件