Path Tracing Lab 1 Note
Overview
灰度,基于球体对象的场景描述,简易 diffuse/specular/refrection 的材质描述。主要类支持 JSON I/O。
https://github.com/mollnn/CGLearn_PathTracerSimple/tree/main/PathTracingLab1
Notes
PathTracing 函数的结构
首先判定递归边界条件(直接设置跟踪次数上限),然后计算光线与场景的交点,处理出法线切线各种角度以及折反射光线方向(不包括漫反射光线),根据材质属性和菲涅尔公式计算 D/S/R/A 的强度,以与强度正比的概率来决定这条光线的下一步,如果是漫反射的话再去计算漫反射的光线参数。
材质
将材质视为几种基本材质的线性叠加。
DIFFUSE,依据 BRDF 理想漫反射,此时单位半球在积分时由于乘以了余弦因子,其贡献比例恰好等效于投影圆内的等面积比例,因此我们相当于在投影圆内等面积地随机选点。
SPECULAR,理想的镜面反射。
REFRECTION,折射材质,但我们需要根据菲涅尔公式来计算这一部分发生反射与折射的比例。根据
即可计算出反射能量的比例,从而也得到了折射能量的比例。
ABSORB,吸收,不再追踪下去,直接返回。
EMISSION,自发光(我们所有的光源都是用带有自发光材质的物体来充当),直接线性叠加到按照上方四种材质计算出的追踪结果上。
相机
按照真实世界相机参数等比例计算,可以在 camera.json
中设置相机参数,测试时我们采用的是标准 135 底片大小 (36mm imes 24mm),测试了几种常用焦距 (24mm, 35mm, 50mm, 70mm)。
踩坑
光线反射或折射后,从射线的起点位置沿着其方向前推一个微小的长度作为新的起点位置,有效避免浮点误差带来的一些错误。之前没有这样做,也没有进行其他特殊的处理,导致出现了可以穿过 SPECULAR 球透视的情况。
感想
想做得结构完整一点,于是各种接口类的东西弄得挺麻烦的,不过好在后面就可以直接搬来用了。当然还是有许多地方需要修改的,明显感觉自己造一些基本的东西如一个 Vector3D
类时,虽然很简单,能跑起来,但是有很多不够规范不够健壮不够自然不够优雅的地方。
理论知识后面还需要多学习,这次只能说是照葫芦画瓢。当然第一次把瓢画出来还真是挺感动的。
闲话
从开工到现在,零零散散正好两个礼拜,每天写一点,不知不觉,第一个 Lab 也就手工了。这两个礼拜里我也没放下别的事情,还是上着课写着作业刷着 Codeforces 玩着 Leetcode,时不时也学几页和声看几章 BQ,差点忘了上周还抱大腿苟了块 Au,只记得今天早上还刚摆弄着 DaVinci。
比起酱,它反而更像是线。
从初三毕业开始,好像就再也没有去做过一些事情,转而去做了另一些事情,似乎挺辛苦但也挺投入,但逐渐忘记了自己最初要的是什么,为什么要走上这样一条道路。
但有些事情,当初看觉得没什么意义的,日后回头想想,其实也不尽然。小的收获大的收获自然是有的,但也不止于此。所谓 Connecting dots,所有的事情仿佛都有所指向,仿佛是一个人的生命,甚至整个世界,在以行为与反应来展开其自身。
记得高二下的那个七月翘课出去培训,我独自坐在高铁上,那是最后一次冲 PhO 的机会了,我在新打印的习题集上写下:这是最后的路,希望我们能一直走下去。不知为何,我此刻忽然回想起了这句话。
这不是最后的路,希望我们能一直走下去。
2020 年 12 月 18 日,夜
于九龙湖 J3