本文主要对smallpt的光线跟踪函数进行详细的解释
1. 光线跟踪详细解释
计算法向量,计算折射光线,反射光线等,可以查阅《3D数学基础,图形与游戏开发》
1.1 计算部分
Vec radiance(const Ray &r, int depth, unsigned short *Xi) {
double t; // 与射线相交物体的距离
int id = 0; // 与射线相交物体的id
if (!intersect(r, t, id))
return Vec(); // 如果都没有相交,则返回emisson(0, 0, 0)
const Sphere &obj = spheres[id]; // the hit object
Vec x = r.o + r.d*t, n = (x - obj.position).norm(); // 计算n,球面法向量
Vec nl = n.dot(r.d) < 0 ? n : n*-1, f = obj.color;
double p = f.x>f.y && f.x>f.z ? f.x : f.y>f.z ? f.y : f.z; // 找出最大的值
if (++depth>5||!p)
if (erand48(Xi)<p)
f = f*(1 / p); //假设f为(0.5, 0.2, 0.2),