RayTracingWeekend-Note

[TOC]

Github地址

总结

写了demo,也有段时间了,需要总结一下知识点,以后再看也能快速想起。

文章一共分为14章节。

第2章介绍了PPM文件格式,以及通过cout将数据写到ppm文件里展示成图片,这个就是渲染引擎的展示”窗口“。

第3章写了vec3等基础类,包括叉积点积等,同样比较基础。

第4-5章主要定义了这个渲染引擎读光线的抽象表示,表示为A+tB,其中A是发光点,B是方向向量,A+tB代表的是光线和物体相交的点,将表达式带入球体坐标公式,是否相交转换成t是否有解,是否有解可以通过一元二次方程的求解b方-4ac获得。这样的话可以将空间的球体和光线转变成到某一个平面的映射,得到图片结果。

从第6章开始,逐步进入较深入的讲解,这才是光线追踪的”正菜“。

第6章首先介绍如何计算法向量,并将法向量的值转成RGB存储到圆中。然后将sphere进行抽象化为hittable和hittable_list。能够绘制多个球型。

第7章讲了抗锯齿,原来的方案是如何实现的呢?因为PPM记录的是w*h个像素值,原来计算每个坐标点,坐标是整数,每个坐标点只计算一次颜色,那么现在加了一个random方法,取值范围0-1,也就是当前的像素,会采样很多次,每次都是在这个像素的坐标的整数范围内将精度调整为double多采样几次,这样计算颜色的平均值,能够达到抗锯齿的效果。对比brensenham画线算法,发现都是类似在浮点数的范围内,求整数解导致的不连续的问题。

第8章讲述了漫反射的实现。漫反射和材质有关,是不确定方向的,但是不会越过切面进行反射。实际上,原文的实现是在法向量(切面)上找到一个单位的球体,然后随机的找到一个点,当做该次漫反射的方向,该漫反射光线仍旧会再次反射,所以定义max_depth,定义反射最多的次数。

第8章还讲述了gamma校正,对颜色的值采取计算根号的方式,后面其他的笔记会着重讲gamma校正是什么。除此之外,还简略的说了一下朗伯反射,这里建议详细看其他的笔记资料。

第9章介绍了金属材质,也就是镜面反射的实现。第9章先是将光照进行了抽象,material,然后hittable都具备一个material。镜面反射的一个特点就是入射角和反射角相等,通过这个特点,得到反射的方向,再定义反射率,得到反射光线的颜色和方向。

第9章的最后介绍了模糊反射的实现,也就是反射的最终的方向加上个了随机方向的单位向量的偏移。这里也需要是单位向量,因为最终映射到组中的像素是整型。

第10章介绍了玻璃材质,也就是折射的实现。首先介绍了Snell's Law,即入射角反射角的关系和运算,代码中传入的是入射角和折射角的比值,通过Snell's Law计算折射方向。注意到沿着折射方向的反方向观察,可能不能进行再次折射(介质不一样),代码通过反射进行模拟。文中还介绍了Schlick Approximation,此处暂时省略,后面会补上。

第11章介绍了Camera方位的实现,比较简单,可以参考TinyRenderer中对ViewMatrix的推导,一样的道理。

第12章介绍了失焦(模糊的实现),后面再补充具体原理。代码中定义了光圈的大小,实际上调整了光线origin的位置,在光圈大小范围内随机射出光线。代码还传入了一个焦距(eye-center)的距离,然后计算了投影面的宽高,实际上和lookat的矩阵推导比较相似。

第13章给了一个最终的较复杂的实现效果。渲染特别缓慢,没有BVH的计算,关于BVH请看我的其他的笔记。