目录
⼀、光线追踪 1
⼆、景深、软阴影、抗锯⻮与贴图 1
1. 景深 1
2. 软阴影 1
3. 抗锯⻮ 2
4.贴图 2
渲染效果 3
1. 球⾯的颜⾊及凹凸贴图、平⾯凹凸贴图(两侧砖墙)、表⾯材质类型贴图(地⾯) 3
2. 景深,三个100k⻰模型(材质分别为带颜⾊的折射、带颜⾊的反射、漫反射) 4
三、参数曲⾯解析法求交 4
渲染效果 5
四、GPU并⾏加速 5
五、光线求交加速 5
AABB BVH 5
KD-Tree 6
六、代码结构 7
⼀、光线追踪
采⽤蒙特卡罗路径追踪算法,通过多次采样从相机发出的光线并追踪其路径,计算路径上的发光、 反射、折射等带来的颜⾊权重,最后求平均以求解物体表⾯的渲染⽅程,这个过程求解的渲染⽅程结果 是⽆偏的,缺点就是收敛速度极慢,采样数直接影响了渲染结果的质量,采样数的增加⼜会导致渲染时
⻓增加。且由于只追踪从相机发出的光线(即单向路径追踪,区分于双向路径追踪),导致当光源⾯积 很⼩时很难收敛,也难以模拟焦散等特征。
实现路径追踪的基础算法时主要参考了smallpt,同时借助SmallPT —— 99 ⾏代码光线追踪解析以理解算法。实现了漫反射、镜⾯反射与折射三种表⾯材质类型。
光线追踪中⽤到的求交逻辑除了参数曲⾯外均基于前⾯⼏次PA。 代码⻅include/pathtracer.cuh
⼆、景深、软阴影、抗锯⻮与贴图
1.景深
原先的针孔相机模型中,相机(发出初始光线的位置)即为空间中⼀个点;⽽在模拟景深,即带光 圈的相机时,相机(发出初始光线的位置)可以是光圈位置的任何⼀个点,所以通过指定光圈⼤⼩,随 机化地选择初始出射光线来模拟景深,为此另外定义⼀个焦距参数。
在与相机所在位置的距离等于焦距的平⾯上,物体应该清晰可⻅,光圈中随机发出的光线需要满⾜ 这⼀特征。采⽤的⽅法是,先在光圈内随机产⽣⼀个点作为光线的出射点,然后计算这个光线的⽅向, 使得其能刚好射向焦点,出射点加⽅向即构成完整的出射光线。
景深相机的代码⻅include/camera.cuh 的getRay 部分
2.软阴影
通过对⾯光源采样,被物体阻挡的部分并不是完全⽆法采样到光照,⽽是随被遮挡的程度逐渐加深
⽽呈现出逐渐变深的阴影,因此可以得到带有渐变过渡的阴影。在实现中由于不定义光线,⽽直接给物 体材质加上发光这⼀特征,因此可以⽅便地实现⾯光源,即⾃然实现了软阴影。
不附上具体代码,实现结合在pt当中
3.抗锯⻮
参考smallpt,实现的是SSAA*4抗锯⻮,即将每个像素分为四个⼦像素进⾏采样,采样完毕后将四 个结果取平均作为对该像素本次采样的结果。SSAA的优点是实现⾮常简单,但相应的增加了数倍采样次 数,⼤⼤增加了渲染开销。
代码⻅main.cu 的renderPixel 部分,每个像素都分成四个⼦像素渲染再压缩
4.贴图
实现了平⾯与球体类的纹理映射。对于平⾯,采⽤了指定区域平铺+拉伸的映射⽅法,在创建平⾯ 时可以选择⼀个平铺的基准点以及平铺的两个⽅向向量,⽅向的⻓度同时也决定了材质的拉伸程度。对 于球体,采⽤了墨卡托投影,直接通过交点处的法向换算出uv空间坐标。