type
Post
status
Published
date
Nov 24, 2022
slug
raytracing_introduction
summary
光线追踪(Ray Tracing)是3D计算机图形学中一种特殊的渲染算法,用于在基于物理的渲染方式中模拟真实世界中的光线照射方式。目前,在动画、游戏等领域已经得到广泛使用。通常情况下,光线追踪很难定义它到底是什么,我们可以简单理解为与传统渲染方式(光栅化)相对的一种渲染方式。光线追踪实现了对光线的模拟,包括光的反射、折射、散射,甚至可以实现波动光学中光的各种性质,虽然能够得到非常不错的效果,但是模拟波动光在理论和实现上具有较大的难度,这也让很多人望
tags
光线追踪
category
计算机图形学
icon
password
Property
Nov 24, 2022 12:20 PM
本系列为光线追踪专题,本章不涉及理论知识,后续章节将从理论出发,对光线追踪技术进行详细说明,欢迎持续关注

什么是光线追踪

  • 光线追踪(Ray Tracing)是3D计算机图形学中一种特殊的渲染算法,用于在基于物理的渲染方式中模拟真实世界中的光线照射方式。目前,在动画、游戏等领域已经得到广泛使用。通常情况下,光线追踪很难定义它到底是什么,我们可以简单理解为与传统渲染方式(光栅化)相对的一种渲染方式。光线追踪实现了对光线的模拟,包括光的反射、折射、散射,甚至可以实现波动光学中光的各种性质,虽然能够得到非常不错的效果,但是模拟波动光在理论和实现上具有较大的难度,这也让很多人望而却步。所以,在本系列中,只使用光线追踪模拟较为简单的几何光学(这也是大多数情况下会使用的方式)。
notion image
光线追踪这个概念并不是最近才提出的,早在20世纪80年代光线追踪已经作为一个研究课题开始了不断的探索,但是受限于当时硬件算力的不足,光线追踪的进展一直很缓慢。直到2018年,这一年也被认为是光线追踪元年,GDC 2018上光线追踪才正式进入大众的视野,这一年,微软宣布DirectX Ray Tracing(DRX)的问世;NVIDIA、ILMxLAB、UE4联合发布了基于实时光线追踪的具有电影级视觉效果的《星球大战》短片;NVIDIA发布了RTX Tehnology Demo以及Project Sol Cinematic Demo Part 1;EA SEED团队带来了PICA实时光线追踪Demo;Remedy的Northlight引擎带来了Ray Tracing in North Light Demo;Futuremark团队发布了DirectX Raytracing Tech Demo。
notion image

光栅化渲染方式的弊端

作为最为传统的渲染方式,光栅化一直以来都是最主要的渲染方式,同时光栅化也是最原始的渲染方式,由于其渲染速度快,现在仍是3D游戏的主要渲染方式。但是由于其渲染的原理是通过各种变换将矢量图形投影在屏幕上并进行像素化(采样),并不能体现被渲染物体的物理性质。因此,光栅化渲染方式对物体阴影、光的反射、折射等现象无法进行准确描述,所渲染出的图像真实感较差。

光线追踪的优势

作为一种基于物理的渲染方式,光线追踪所实现的效果是十分接近真实场景的,因为其很好的模拟了光在传播过程中发生的反射、折射、散射等现象,使得物体的材质属性得到很好的表现,但是由于模拟光线传播过程需要使用递归算法,渲染速度远不如光栅化。近些年,在工业界和学术界的共同努力下,光线追踪逐渐实时化,通过对光线算法的不断近似和简化,实时光线追踪得以实现,并在3D游戏中得到了不错的应用。

光线追踪发展历史

光线追踪算法的起源可以早至1968年,Arthur Appel在一篇名为《Ray-tracing and other Rendering Approaches》的论文中提出的光线投射(Ray Casting)的概念。光线投射其实只是一根单一的从一个点向一个方向发射出光线,它与场景中的物体相交时停止,Appel的算法中使用了View Ray和Shadow Ray两条光线,这计算出来的其实就是光照方程中的直接光照部分。paper
1979年,Turner Whitted在光线投射的基础上,加入光与物体表面的交互,是光线在物体表面沿着反射,折射以及散射方式上继续传播,直到与光源相交。这种算法形成了一个递归的光线穿梭,因此此时不再是一根单一的光线,而是形成了一个光传输的路径,此时的算法称为递归光线追踪(Recursive Ray Tracing,或者Whitted-style ray tracing)。Whitted的模型是基于纯高光反射的,它假设物体表面绝对光滑,这显然和大自然中大部分物质的表面属性不相符。paper
在计算机图形学中,一个像素的尺寸远远大于光的波长,在这个微观尺寸(Microfacet)下,物体表面是不光滑的,也就是说进入一个像素的多个光线可能分别被反射到不同的方向上,根据表面粗糙度的不同,这些散射的方向呈现不同的分布,非常粗糙的表面可能比较均匀地周围反射,而比较光滑的表面反射光则集中在光滑表面的反射方向附近。在现代渲染技术中,这些反射特性通常被使用Microfacet BRDF公式表述出来,它基本上使用一个简单的粗糙度方向就可以模拟出比较真实的光反射分布。结合金属性等一些参数,这就是目前流行的基于物理的渲染模型。
1984年,Cook提出了分布式光线追踪(Distribution ray tracing),他使得原来一束单一的反射光变为围绕一个空间中漫反射或高光反射范围内的积分计算,如下图所示。为了计算积分方程,蒙特卡洛方法被引入,所以Cook的方法又称为随机光线追踪(stochastic ray tracing)。Cook的模型计算代价非常高,每一条从摄像机发出的光线在表面点是被反射至多个不同的方向,分散成多束光线,以此递归,每条光线最终形成一个光线树(a tree of rays),尤其对于间接漫反射光,它几乎要反射至整个可见空间。
1986年,Kajiya统一了光照公式,并推导出了光照公式的路径表述形式,使得光照公式由一个递归的结构,变成一个路径函数的积分,因此蒙特卡洛的每个随机数只要产生一条路径即可,这些路径不需要是递归的,因此每条路径可以随机生成,然后每个路径的值作为一个随机数用于计算最终的光照结果,这种新的形式称为路径追踪(Path tracing)。paper
1993年,双向路径追踪(Bidirectional path tracing)由Lafortune和 Willems提出,它分别从光源和摄像机两个方向出发,分别经过一定的路径之后,将该两条路径的终点链接起来形成一条完整的路径,这样大大增加了光源的有效贡献。Veach则对双向路径追踪做了详细的描述paperpaper
1997年Veach首次将最早应用在计算物理领域的Metropolis采样方法引入图形学,提出了Metropolis Light Transport(MLT),使用Metropolis采样方法对全局光照计算中用到的路径空间进行采样,这样就产生了一种新的全局光照算法,称为Metropolis光线追踪。。paper
2005年由Cline提出了Energy Redistribution Path Tracing(ERPT)的方法,是一种无偏的绘制方法,它是一种基于Energy Redistribution采样的路径追踪方法。paper
2012年Jakob提出了Manifold Exploration,提出了一种非常巧妙的方式来解决由完美的镜面或折射链接而成的光路依靠随机采样非常难得到的问题。paper

如何学习光线追踪

关于如何学习光线追踪,本系列文章将从理论到实现上完整的说明如何实现一个光线追踪方法,同时,这里也给出一些非常不错的参考资料。
视频资源:
  • GAMES101,加州大学圣芭芭拉分校助理教授Lingqi Yan(闫令琪)
书籍推荐:
其他学习资料:

总结

在本章中,我们介绍了光线追踪,简单介绍了光线追踪的发展历史(在之后的章节中,会一一详细分析各个算法),在最后给出了一些适合入门的学习资料。

参考文献

[1] Real-Time Rendering 4th Edition. Tomas Akenine-Moller, Eric Haines, Naty Hoffman, Angelo Pesce, et al.
[2] Physically Based Rendering 3rd Edition. Matt Pharr, Wenzel Jakob, Greg Humphreys.
[3] 实时光线追踪技术:业界发展近况与未来挑战. 毛星云. https://zhuanlan.zhihu.com/p/102397700.
[4] 光线追踪. babalqi. https://zhuanlan.zhihu.com/p/72673165.
[5] 全局光照技术进化史1-光线追踪篇. 秦春林. https://zhuanlan.zhihu.com/p/24063586.
一个Django版本的开源WebStack导航站点【Ray Tracing】光线追踪——光线的定义