MCPLive > 杂志文章 > 3D未来争夺战 光线追踪算法浅析

3D未来争夺战 光线追踪算法浅析

2010-01-28刘泽申《微型计算机》2010年1月上

光线追踪VS光栅化 画质谁更精美?

由于光线追踪算法和现实世界中的物理规则几乎一样,所以在构建精美的3D场景的时候,就有了得天独厚的优势。在画面质量上,光栅化在光线追踪算法面前几乎没有还手之力。光栅化技术要实现媲美光线追踪算法一样的真实场景反射、折射效果,对开发者而言简直是噩梦。

在当今大部分游戏中,实现环境光反射效果都使用了Environment Map(环境贴图)技术。这种技术可以比较好地欺骗玩家的眼睛,特别是实现远处细小物体的反射效果,但当我们靠近3D物体仔细观察的时候,环境贴图就会露出马脚。环境贴图效果实际上只能对一张静态图片进行处理,在你仔细观察的时候,就会发现环境贴图里面的景物不过是开发者之前预设的障眼法,无法根据实时状况发生变化。

在大部分赛车游戏中为了实现近距离车身的反光而不穿帮,大多使用了动态立方贴图(Dynamic Cube Map)技术。立方贴图技术允许开发者将场景视点和玩家观察角度保持一致,然后再重新渲染画面,把渲染结果保存下来供渲染使用。立方贴图虽然看上去不容易穿帮,但仔细观察你就会发现问题。自然界中的光线总是会存在不断的相互反射,例如上图中,使用立方贴图技术实现的茶壶,虽然很好地反射出了飞机,但却无法在茶壶口上出现飞机的反射画面。在现实世界中,不仅仅是光滑的茶壶壁上会反射出飞机,在茶壶口上依然会出现飞机的倒影。

你千万别以为我们在吹毛求疵,事实上要实现图中如此逼真的反射效果已经需要巨大的运算量,通过立方贴图实现的反射,往往需要重复渲染多次。而在渲染过程中,立方贴图也不像传统3D画面那样重新计算视点和坐标。为了获得理想的运行速度,日常游戏中大多只在近处使用立方贴图,为了避免大幅降低显卡填充率,在使用立方贴图的时候很多游戏开发者还故意使用了低分辨率渲染。至于游戏中的其他反射,由于显卡性能限制,大多只是用简单的环境贴图实现。

如果用光线追踪来实现各种反射效果会怎么样?根据我们上面介绍的光线追踪特性,这个技术可以用算法控制整个3D场景中的所有反射效果。在光线追踪计算中,所有的反射效果都能被计算在内,就连漫反射和多次反射都不会漏掉。以下方汽车渲染图为例,这辆布加迪车身的反射不仅相当真实,就连赛车背后的玻璃表面的反光也和现实世界完全吻合,如果使用光栅化算法要实现这样的效果,开发者的工作量简直难以想象。


透明玉石效果的造型用光栅化算法实现,难度惊人而且极易出错

如果说反射效果是光栅化和光线追踪算法的试金石的话,那透明效果的实现,就是光栅化算法和光线追踪算法的分水岭。传统的光栅化算法要获得准确的透明效果,十分依赖透明多边形在渲染序列中的位置。一般来说,透明多边形必须在后被渲染处理,并且好远离视点附近的物体。这样一来,开发者不仅需要耗费大量的时间精力在安排渲染顺序上,还需要确保调整过的渲染顺序不至于渲染出错误的结果。在业界包括A-Buffer等技术都被开发出来辅助实现透明效果,但这些技术大多收效甚微,没办法成为业界标准。要处理透明效果,光线追踪算法完全不费吹灰之力——还记得我们之前介绍的反射、折射辅助光线吗?即便是透明物体,也因为表面发生反射才能被人眼所看到,对于光线追踪算法而言,透明物体和不透明物体在处理上没有任何区别。

在阴影处理方面,光线追踪算法也同样有着得天独厚的优势。传统的光栅化渲染中,处理阴影大多使用阴影贴图的方式,这样的方式需要耗费大量的显存,并且难以实现抗锯齿效果。而在光线追踪算法中,光影计算是整个算法基础的部分,无需对渲染引擎做任何修改就能实现真实的渲染效果。


光线追踪算法渲染实现的效果要逼真很多

曲面处理同样是光线追踪算法为擅长的领域。在当今各种3D游戏引擎中,要处理曲面大多是通过镶嵌细分曲面(Tessellation)来实现,简单地说就是把一个曲面自动用更多的多边形填充以获得“圆滑”的显示效果。要实现这个功能,对于开发者而言并不费劲,但却会极度消耗GPU资源。即便是微软也只是在DirectX 11中有限地引入对Tessellation功能的支持——在DirectX 11以前,Tessellation曲面处理技术只是各个显卡厂商的独家标准,没有任何兼容性可言。

光线追踪算法如果遇到曲面,又该怎么处理呢?难道也是把弧形拆分成若干三角形吗?非也,任何曲面都将导致光线传播路径的变化,也就是说只要计算出光线的交点,就能精确地得知渲染对象曲面的各个数值,更无需为复杂的三角形填充。

分享到:

用户评论

用户名:

密码: