§7.4更多Shader

Normal Mapping看起来很棒,但还有很多办法可以改善三维物体的视觉效果。在Rocket Commander游戏中我也使用了视差映射和很酷的post screen shader。您可能雄心勃勃想在你的游戏中实现glass shaders,reflection effects,cool water shaders等效果。本节我们简单浏览一下在你的xna游戏引擎中还可以实现哪些shader。在网上或关于shader的书籍中有很多例子有很多例子可在网上或在许多着色的书籍有。在NVIDIA主页, www.shadertech.com, GPU Gems(NVIDIA出版的一本书),Game Programming Gems books(作者Charles River Media),或shader X系列丛书(作者Charles River Media,主编Wolfgang Engel)上有很好的例子,从中你可以学到很多。但除非有人帮你写shader,最终还是要靠你自己。

Offset Mapping

视差映射(parallax mapping)也被称为Offset Mapping,因为点被重新映射,但通常Offset Mapping意味着原来的视差映射效果意味着原来的视差映射效果通过高度贴图被转到另一个level。Offset Mapping另一个常用的名字被称为steep parallax mapping,由2005年4月由Morgan McGuire和Max McGuire写的一篇文章中被提出。游戏F.E.A.R首先使用了这种技术,采用2至3层的高度贴图,效果很好。

 steep parallax mapping实现起来有点复杂,要用20到或更多层才能让效果真正不错,好处是你能计算自投影(见图7-22)。这个效果无需使用3D几何数据而完全在pixel shader中实现,看起来很了不起。

图7-22

 这项技术最主要问题是代价高昂。你不光要花大量时间使这种技术正常工作,更重要的是它占用了大量的Pixel Shader执行时间。这种shader要比Normal Mapping 慢20倍左右,虽然在演示程序中你可以只采用少量多边形就能产生一个很酷的效果,但在一个真正的游戏中你可不光想要这个效果,还要考虑到方方面面,所以并不实用。这种技术也许在将来可以作为改进现有游戏的一个选择,或者使用最高端的显卡让游戏效果更好。

Glass Shader

模拟玻璃并不容易,最主要要面临两个问题:玻璃除了反射周围的环境也会折射背后的东西。反射意味着像镜子一样,从观察者方向射来的光线会被反射回去并被观察者看到,如果观察者站在玻璃前还会看到自己;折射意味玻璃后的世界(例如,如果您正通过玻璃向外看)会随着玻璃厚度、结构、颜色等发生扭曲,有时甚至玻璃表面还有其他结构(如浴室窗口的毛玻璃)。

更复杂的是同一块玻璃的行为往往也不遵循相同的方式,从玻璃顶部看和从玻璃旁边看反射情况也不同,从顶部看反射更强。如果光线不佳或玻璃肮脏的,可能反射很弱。总之有很多问题需要考虑。但你没必要使效果完美,你通常会忽略那些不十分重要的东西,只留下一些较酷的视觉效果(见图7-23)。你可以在本书的后面找到这辆车和使用的shader。

图7-23

(水面反射)Reflection and Water

对玻璃而言你要放弃简单的的反射shader,因为它反射了sky cube box(天空盒)(如需了解更多关于天空盒的知识见下一章)。对更亮的金属表面或镜子,只反射天空盒可能还不够。您要考虑反射周围环境的特定物体去实现更加真实的效果。这不容易也很慢,因为要渲染一个简单的3D物体周围的环境,你必须渲染一个反射的天空盒贴图,这种DirectX10中一步就能实现,但要求有一个很快的显卡去实现这种动态的材质更新。在DirectX 9或XNA中则太慢,因为要渲染立方贴图的每个方向,你需要渲染6遍场景。

像镜子一样的平面反射会变得简单点,你只需渲染一次周围世界的镜像就可以了。这种技术在水面shader中被使用,看起来真的很酷,特别是在不光反射天空还反射周围的物体时。水面有很多效果(反射,折射,水的颜色,水的动画,波浪等等),需占用大量时间去调整,但很有趣(见图7-24)。

图7-24


发布时间:2008/9/18 下午3:42:21  阅读次数:6501

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号