GLSL Shader特效教程5:高级篇ray tracing(上)
随着技术的飞速发展,手机硬件性能得到了大幅提升,如今手机游戏基本全面进入了3D时代。为了紧跟时代潮流,帮助大家更好地理解3D渲染的原理,今天我们将进入GLSL特效系列的高级篇:光线追踪(ray tracing)。
光线追踪与3D渲染的关系
在探讨光线追踪之前,我们先来了解一下在现实中,人眼是如何观察世界的。
人眼观察世界的原理
- 光线反射:人眼能够看到物体,是因为光线在物体表面发生反射后进入了人眼。这一过程依赖于光照条件,没有光照,我们就无法看到物体。
- 物体颜色呈现:不同物体呈现出不同的颜色,这是由于它们的双向反射分布函数(BRDF)属性不同,通俗来讲,就是物体的材质不同。
- 人眼对光线的敏感度:人眼对光线的明暗最为敏感,其次才是颜色。例如,在光线较暗的场景中,人眼很难分辨物体的颜色,但仍能察觉到物体的存在。
基于以上原理,光照处理方法和计算模型成为了渲染引擎的核心,它们对渲染效果有着根本性的影响。
光线追踪的概念
当光线从物体表面反射并进入人眼时,我们便“发现”了这个物体。那么,其逆过程就是从人眼发出一束光线,当这束光线与物体相交时,物体就被“发现”了。这一逆过程就是我们今天要讨论的光线追踪(ray tracing)。光线追踪包含两个要点:
- 逆向:光线从观察点射出,这与光线进入人眼的正常过程相反。
- 跟踪:跟踪光线的路径,包括折射和反射(基于BRDF)。
由于光线追踪的计算模型与人眼的工作原理非常相似,因此它能够渲染出极其逼真的效果。这也是光线追踪技术成为图形渲染技术发展主要方向的原因。POV-ray是目前光线追踪技术发展的标杆,大家可以到POV-ray官网上查看其渲染效果,简直“以假乱真”。
光线追踪的优缺点
光线追踪需要跟踪光线的路径,这使得计算量大幅增加,因此对GPU的硬件要求较高。在游戏引擎中,由于性能限制,光线追踪的使用相对较少,但在PC上运行则没有太大压力。虽然游戏引擎中很少使用光线追踪技术,但它对于初学者理解3D引擎的渲染过程和原理非常有帮助,尤其是光照部分的计算、相机的工作原理以及透视矩阵的变换。
光线追踪的发展历史
光线追踪技术的发展经历了以下几个阶段:
- 光线投射(ray casting):其代表应用是3D游戏中的光线拾取(ray picking),通过2D屏幕的坐标计算出对应的3D世界坐标。
- 光线步进(ray marching):重点在于“步进”,强调光线的前进过程。当光线在前进过程中碰到物体时,便停止前进,然后根据碰撞点和前进距离计算物体的光照模型。
- 光线追踪(ray tracing):强调“追踪”,当光线碰到物体后,不会立即停止,而是根据物体的BRDF继续跟踪光线的运动路径,包括折射、反射、吸收率和强度衰减等。跟踪迭代的次数越多,计算量越大。光线追踪是在前两者的基础上发展起来的“高级产物”。