欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

3D地形编程之GeoMipMap基础(2)

程序员文章站 2022-06-03 14:46:42
...

图 5.4 在 Geomipmapping 算法 中,随着图块远离观看者,选择更低的细节级别。 图 5.5 Geomipmapping 白皮书中呈现的作为图块渲染的三角形排列方式。 这种排列可能看起来像是一个比较好的主意,并且它在很多地方使用。 ( 警告:我会在这里稍微转变下话题。 )

5.4 Geomipmapping算法中,随着图块远离观看者,选择更低的细节级别。

3D地形编程之GeoMipMap基础(2)

5.5 Geomipmapping白皮书中呈现的作为图块渲染的三角形排列方式。

这种排列可能看起来像是一个比较好的主意,并且它在很多地方使用。(警告:我会在这里稍微转变下话题。)如果你计划用顶点缓冲渲染块,三角形带将有明确的传送路线,这是我给你的建议。然而,因为实现顶点缓冲渲染系统对API有非常高的依赖,我选择用直接方式渲染,因为如果有需要的话,这样更容易变换到其他API的语句。用顶点缓冲给渲染提供快捷的速度以增强任何地形实现,因为当你单独的发送每个顶点、纹理坐标、颜色等等给API时它减少当前的函数头。另外,大部分显卡喜欢顶点信息作为顶点缓冲的类型传递。在最后,我劝告你们使用顶点缓冲做为地形渲染。你将得到极大地速度的提升,并且它总有额外的成果值得完成它。如果你想看GeomipmappingDirect3D顶点缓冲的技术实例,请看“Simplified Terrain Using Interlocking Tiles,”在游戏编程精髓,第2册。

不管怎样,是时候回到主题了。图5.3展示的排列方式是我们渲染图块要用的方式。这种排列提供给我们一个很大的好处:当我们需要的时候它让我们容易的跳过渲染一个顶点,这是非常经常的。它带我进入我们下一个讨论的话题。

砍的痕迹和裂缝,

但通常只是裂缝

经常的当你应对CLOD地形算法时,你必须应付断裂的对象。断裂的发生,在Geomipmapping中,是当高细节的块邻接着低细节块时(看图5.6)。

如同你从图片中所见一样,在左边的块比右边的块的细节级别高。我们的问题位于AB两个点。这个问题是在A点的左边比在B点的细节级别高。意思是左边的块在A点会渲染精确的高度,但是右边的块只是取高于它和低于它的平均高度。(应该是说左右两边细节级别不同所以高度不同,高级别的那边高度更精确,低级别的这边高度是上下2个邻接顶点的平均值,左右高度不一样就会裂开了。)

3D地形编程之GeoMipMap基础(2)

5.6 2个图块,不同的细节级别,并列一起。

这整个“断裂”东西可能似乎没这样大的数量,但是看看图5.7,展示了我没用抗裂痕度量的Geomipmapping实现的效果屏幕截图。

3D地形编程之GeoMipMap基础(2)

5.7 没使用反裂痕度量的Geomipmapping实现的屏幕截图。

这不是精确的平滑地面,不是吗?只能在景象中看到裂开的洞。让我们修缮它吧!

断裂试验你的Geomipmapping引擎

断裂试验你的Geomipmapping引擎比听起来容易许多。某人(有可能是我)给你解释这个概念,你就会得到更多的好处,让整个进程如同……一样简单,好吧,某些事情简单。

我有2个可能的选择方法来修缮断裂问题。一个方法是给低数量细节的块增加顶点,这样有问题的顶点将与高细节块的顶点的高度一致。这个解决方法可能很丑陋,尽管如此,这意味着我们需要重新排列块(添加其他的三角形扇面)。

另外个解决问题的方法是删除更多细节块的顶点。这个方法无缝地、轻松地解决断裂问题。看图5.8看这是多么容易的事,简单的删除一个顶点修缮了裂缝。

3D地形编程之GeoMipMap基础(2)

5.8 省略渲染AB2个点的顶点,根除了裂缝。

尔裂缝的艺术在哪里?

你知道裂缝的起因并且知道怎么修缮它们。真正的问题是:你怎么知道什么时候修改它们?在根本上,当你渲染目前的块时,你需要测试这个块周围(看图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;

3D地形编程之GeoMipMap基础(2)

5.9 邻接的块需要被测试,看它们是否更低LOD

看到它是多么简单了吧?在测试之后,渲染你的三角形扇面,你跳过较为粗糙的块的顶点。例如,如果右边的块是较粗糙级别的细节,而当前块是高细节级别(多部分的列/行三角形扇面被渲染),这时你只想跳过图块的右边远处的顶点(看图5.10)。

小心

请小心你移除的只能是有必要的顶点。否则,可能由一个满顶点的图块结束这意味着没移除。例如,在图5.10中,图块由多部分的三角形扇面行和列构成。你不想删除每个扇面的右边顶点;你只想删除最右边列的扇面的右边顶点。

这就是给你的简单的Geomipmapping理论!现在是时候了,我们实现所有东西,我们刚才学的。