本系列根据国外一个图形小哥的讲解为本,整合互联网的一些资料,结合自己的一些理解。
什么是光线追踪
该方法是通过跟踪穿过图像平面中每个像素的光路来生成图像。
在现实世界中,光从光源出发,然后到达我们的眼睛。然而,我们在光线追踪中以相反的方式做到这一点。
为什么要用光线追踪?
通过光线追踪渲染的场景比扫描线渲染更加真实,它还可以模拟多种光学效果,如反射、折射、阴影、散射、焦散等。
光线追踪的基本思想
从根本上说,它是基于几何光学的数字模拟。光线追踪使用向后映射的方式,从观察者到物体,然后从物体到光源的有限数量的光线。
光线追踪算法
- 假设场景已经转换到图像空间,假设观察者位于 z 轴正方向
- 生成初次光线,每条光线从屏幕像素传递到场景
- 沿着射线路径找到最近的物体(找到光线和物体之间的第一个交点)
- 计算光采样点,应用光照模型来确定光源的直接贡献
- 递归生成二次射线
光射线生成
生成射线遵循两点之间的直线方程。
通过这种方式,我们可以从视角产生初始光线。
但有一个问题。我们的场景中通常存在很多几何图形,计算它们的所有反射成本太高。我们可以根据包裹子网格的新网格(边界体积层次结构)来计算它,而不是再次计算基元
计算光线交点
交点在球体上
我们有两个方程。一个是关于射线的,另一个是关于球体的。然后,我们可以通过线性求解方程来求根。
得到交点 P 后,我们需要找到该点上的法向量。
它与从球体中心点到P点的矢量方向相同。我们只需要将其归一化即可。
交点在三角面上
- 检查射线是否与包含目标三角形的平面相交,平面方程表示为平面上任意两点及其法线的组合。
2. 如果满足条件一,则检查三角形区域内部是否存在交点。
首先,使用两条边 (V1, V2) 计算法线向量 (N1),然后我们在 (p-p0) 和法线 (N1) 之间进行点积。如果结果为负,则表示交点在三角形之外。
优化
关于求交点,单纯地计算所有交叉点太费力了。我们可以使用包围盒层次结构来加速该过程。
与三角形相交类似,我们首先检查光线和包围盒之间是否存在相交,如果它相交,我们就进入包围盒的子节点,然后不断重复该过程!
让我们来看下面的例子。在此图中,光线进入包围盒1,与包围盒 2 相交。然后,我们需要进入包围盒的下一个深度,计算出也与包围盒 B 相交。像这样,我们重复这个算法,直到它击中最后一个子节点。