XNA提供了一个有用的功能是能够在渲染场景中添加雾化效果,它提供简单的模仿真实世界中的雾,让对象逐渐远离相机知道看不到它们。
显然,Windows Phone 7设备可以渲染到屏幕上,有大量内容是被限制的,如果你已打开环境延伸到远方,在某个阶段你必须绘制一条线,并告诉XNA不会去绘制任何较远的东西。这个距离限制对于剪辑平面通常通过设置一个适当的值来达到,当设置投影矩阵,如我们在第7章节所讨论的那样。
缺点是,当对象到达剪辑平面,它们明显消失了。它们通常留下它们的一部分任然可见,当他们的边缘穿过剪辑平面,会导致一个非常不自然的场景。
在它们消失之前,你可以使用雾化效果通过允许它们逐步消失来帮助减少消失对象的影响。这个消失的结果,往往会忽视玩家一个更刺耳的效果。
雾作为游戏特性是非常有用的,也同样有它自己的权利。它可以使得环境感到更封闭更恐惧,还可以添加现场的气氛,带走一些渲染图形经常遭受的临床清洁。
下图所示了一些场景示例,是在更早的XNA中使用雾化效果渲染的示例工程。左边图片雾化效果禁用,虽然仍旧有2张图片显示逐渐增加的雾化效果。在右边图片中,远处的建筑已经完全消失在背后。
XNA通过使用简单而有效的一招来实现雾化。由于它为每一个渲染的顶点计算颜色和光照,它决定了顶点离视角有多远。当顶点变得更远,因此受到更大程度的雾,XNA通常淡化顶点颜色,逐渐向定义的雾的颜色转变。如果对象特别远,它的顶点颜色将完全设置为定义的雾化颜色,引起对象完全雾化并融入背景中。正如其它顶点属性,雾化效果修改三角形的顶点,导致它们全部收到雾化效果的影响。
雾是非常容易使用的,只需要少量的参数来设置。所有这些参数都通过BasicEffect对象提供,并且当我们的类级效果对象初始化时,我们可以在它旁边构建剩余的效果属性。雾化属性当然可以在游戏的任何阶段被修改(即使在个别对象渲染),如果需要的话。
这有4个可用属性来设置雾化行为和出现效果,如下:
1)FogEnabled:布尔值,用来开启/关闭雾化特性。默认值为false。
2)FogStart:设置距离(在XNA单元中,从相机视角开始)在即将开始应用的雾化效果。在这个距离前面的顶点将一点都不会受到雾化的影响。
3)FogEnd:在雾化效果即将结束后设置距离。最终,雾化完全不透明,并且所有顶点在这个距离之上将完全变成雾的颜色。
4)FogColor:雾的颜色。通常当使用雾化来渲染时,使用的背景色,设置的雾化颜色来和它匹配。
一个关于XNA的雾化的实际示例可以在Fog示例工程中看到。FogGame.Initialize函数中设置雾化参数。随意去使用这些参数并用这些效果来试验它们所生成的图形效果。
需要关心的是产生一个好的雾化场景。雾仅影响渲染的三角形,所以背景不会通过任何存在的雾所改变。因此重要的是确保雾化颜色和背景颜色几乎是相同的;否则,固体雾化颜色结构与背景颜色形成鲜明的对比。
然而,使用不同的雾和背景颜色是有用的:如果配置雾以便开始和结束值都为9(整个场景完全充满雾),这个配置将产生一个轮廓倚靠在场景背景中,无论雾的颜色是如何定义的。通过增加雾的最终和开始值的距离,这个轮廓可以消失在视线中。
这也是同样重要的记住在每一个三角形中,在它的顶点中修改来计算雾。如果使用非常大的三角形(诸如在我们示例中的地面),雾并不会总是适用于你所期望的,有时会导致接近的对象受到雾化效果比远离的对象更多。