I. 基本概念
具体的概念, 这里有一个很不错的 paper (https://raw.githubusercontent.com/quietshu/-paper-cg-RayTracing/master/RayTracing.pdf), 下载不下来的话,走这里。以下内容,引自这个paper。
光线追踪(Ray Tracing)算法是一种计算机三维图形渲染算法,其基本出发点就是追踪光线,模拟真实的光路和成像过程。相比于其他大部分渲染算法,光线追踪算法的优势是可以提供更为真实的光影效果,劣势是计算量巨大。
基于对自然界光路的研究,光线追踪采取逆向计算光路来还原真实颜色。模拟的过程中涵盖了光的反射、折射、吸收等特性(精确计算),并辅以其他重要渲染思想(模拟)。其中包含了重要方法,诸如冯氏光照模型(Phong Shading)、辐射度(Radiosity)、光子映射(Photon Mapping)、蒙特卡洛方法(Monto Carlo) 等等。
鉴于光线追踪算法对场景仿真程度之高,其被普遍认为是计算机图形学的核心内容,以及游戏设计、电影特效等相关领域的未来方向。近年来,由于硬件系统的迅速改良,基于分布式、GPU,甚至实时渲染的光线追踪算法也纷纷出现。
算法原理
从视点出发向屏幕上每一个像素发出一条光线,追踪此光路并计算其逆向光线的方向,映射到对应的像素上。如下图,通过计算光路上颜色衰减和叠加,即可基本确定每一个像素的颜色。
基本框架
首先实现完整的空间向量类,包括相交检测、计算光线反射和折射。对反射和折射后的光线递归计算颜色再叠加起来即可算得原光线颜色。若光线未遇到任何物体则返回背景色。
在递归的过程中,光亮会不断衰减。因此可以限制迭代的深度或者光亮小于特定值时停止迭代。
将对应于每一个像素的光线颜色绘制到图片文件的相应坐标,最后输出绘制所得图像。光线颜色的基本递归算法伪代码如下
input : 光线的出发位置和方向向量
output : 反向光颜色
-----------------------------------------
function rayColor()
if no intersection with any object then
return background color
else
obj <- find nearest object from the ray;
reflect ray <- calculate reflect ray with obj;
refract ray <- calculate refract ray with obj;
main color <- the radiance of obj;
reflect color <- rayColor(reflect ray);
refract color <- rayColor(refract ray);
return mix(main color, reflect color, refract color);
基本元素
空间几何体
对于任意的几何体,都需要建立特定函数 f(x) f ( x ) 。自变量 x x 表示空间点的坐标,则
空间光线
光线的参数方程
- s s 是光线的起点坐标
- d d 是光线的方向向量
- t</