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

来源:互联网 发布:科幻世界淘宝店怎么了 编辑:程序博客网 时间:2024/03/28 21:24

到这里《Focus on 3D Terrain Programming》第5章内容就结束了,阅读完这个确实理解了不少。提供了一些不错的思路。

但其中演示代码渲染是采用的单个三角形,这样效率很低了。我根据他的方法想改用顶点和索引缓冲,当然用DX9.

域时(看图5.21)。在图中,块的近似区域的值用黑园点标记出来了。

 

5.21

5.21 低级别块的许多顶点,近似高细节的块的值。

 

你看到图片中多少黑点在低的块中吗?好,那有很多低细节块近似的高度值。这些近似值接近真实值,但不是十分接近。因此,当3级块细分成2级块时(或者反之依然),就产生突变;这是因为这些近似值“代替”了真实值(或者真实值代替了近似值)。

 

Geomorghing修改这个问题是通过计算近似值离真实值多远,并从近似值到真实值更改它超过一系列的255步。(或者再次反之亦然……。好,从现在起,我会假设我们正细化块。如果你正合并块,只要颠倒所有计算。)为了计算每一步移动的单位,用这个公式:

 

5.22

5.22 计算Geomorghing值的公式。

 

在公式里,“to”是需要达到的真实值就是新点的值,“from”是从哪里变换来的近似值就是旧的点的值,“numSteps”是Geomorghing作用点的步数值,这是我建议的255。这整个过程解释起来看起象图5.23中。

 

5.23

5.23 Geomorghing的解释。

 

好吧,这就是了。Geomorghing是个简单的概念,能用很多不同的方法实现它。(我不想限制你的创造力,这是因为我自己不会实现它)。让它有趣的开始吧,但是确定你回来并读了后面那节,这帮助减少你地形实现里面的突变甚至更多。

 

应该稍微制造点突变噪声?

这个答案是不,尽管现在不重要。我们减少地形实现的突变时有点重要。现在,虽然大多数突变真的产生的是改变LOD级别时,能被Geomorghing修复,另一个问题是我们用平滑着色(由顶点)光照。尽管这可能听起来不是个大的处理,它是的。用每个LOD开关,光照应用到块上得到更多/更少的细节,这不应该发生。幸运地是,修复这个问题不算重要,而且你能用些不同方法来做。

 

一个修复这个问题的方法是把地形的光照图和地形纹理图结合在一起。这允许你在同一个渲染过程内做光照和纹理映射。遗憾地是,这意味着你必须使光照图和纹理图一样的分辨率达到最理想的效果。因此,如果你想动态改变光照,你也必须动态改变纹理图,这是很昂贵的代价。

 

另一个修复问题的方法是用一个单独的光照图纹理过程。这是把光照图看作纹理,排出由顶点光照,而允许动态更新它且不必担心纹理图。不幸地是,这意味着你的用户至少需要3层多重纹理这方式才会高效。此外,如果你的用户用2层纹理,做2个渲染过程也不是一个真的好主意。多通道渲染对小模型没什么大不了,但是对一套庞大的多边形数据,象一个地形网格,它就了不起了。

 

解决办法已经完整地展示给你。第1个方式很好,如果不需要动态的斜坡光照或者光照映射,而第2个方法很好,如果你知道你的用户有支持3层或者更多纹理的显卡。小心使用额外的纹理层。

 

总结

好了,这是一个长章节,但是你完成它了。恭喜你!在这章里面,你学习了所有一般CLOD地形,但你也学习到了GeomipmappingCLOD地形算法。你学习了怎么提升Geomipmapping速度和怎么减少因为LOD改变产生的突变。在阅读随后2个章节时保持所有这些技术在脑袋里。鼓励你自己:下一个CLOD算法是基于四叉树结构。

 

参考文献

1 de BoerWillem H.Fast Terrain Rendering Using Geometrical Mipmapping.October2000.http://www.flipcode.com/tutorials/geomipmaps.pdf.