realistic image rendering
目录
1代码整体框架 2
2bézier 曲线造型与曲面建模 2
2.1bézier 曲线造型 2
2.2bézier 曲面建模 3
3真实感场景渲染 4
3.1光线与物体求交 4
3.1.1光线与无穷大平面求交 5
3.1.2光线与球求交 5
3.1.3光线与长方体求交 5
3.1.4光线与旋转 bézier 曲面求交 5
3.2反射、折射与 fresnel 效应 5
3.2.1反射 5
3.2.2折射 5
3.2.3fresnel 效应 6
3.3渲染算法 6
3.3.1path tracing 6
3.3.2progressive photon mapping 6
3.3.3stochastic progressive photon mapping 7
3.4渲染特效 8
3.4.1纹理贴图 8
3.4.2景深 8
3.5渲染加速 8
3.5.1包围盒 8
3.5.2k-d tree 9
3.5.3openmp 9
4图像降噪 9
1代码整体框架
•bezier.hpp 提供了旋转 bézier 曲面的相关功能,包括求曲线上的点、一阶导数、二阶导数的功能;
•bezier_test.py 自己写的一个可视化 bézier 曲线的脚本,方便调试;
•kdtree.hpp 使用 ppm/sppm 算法的时候存储碰撞点所用,支持统一更新碰撞点半径, 在对数时间内查询碰撞点;
•main.cpp 主程序接口,包含相机参数和初始化、景深效果、超采样等功能;
•obj.hpp 定义了一些物体,有球、长方体、无穷大平面、旋转 bézier 曲面;
•ray.hpp 光线类,包含起点和方向;
•render.hpp 渲染引擎,包含 pt、ppm、sppm 等方法;
•scene.hpp 渲染场景的定义;
•texture.hpp 纹理类,每个 object 都包含着一个 texture,在 texture 中可以存储图片、材质信息;
•utils.hpp 最基本的一些定义;
•vec3.hpp 三维向量的定义与运算,包括但不限于:四则运算、点积叉积、反射折射;
其中图片的读入采用 github 上的开源仓库"stb"1实现,图片的输出使用 ppm 格式,可直接以二进制方式写出。考虑到 ppm 格式的图像比较占内存,因此使用 python 的 opencv 包将其转换为 png 格式。代码中除了使用 stb 读取图片之外, 其他全部的代码均为独立实现,共计代码 1184 行。