简单的光线追踪,事cpp课设
本来有vs的文件的,push不上来(悲),以后再试试
main.cpp 里是史山,不要看
- 在
release下载或者编译出程序 - 将
res/里的build.txt和obj模型放置在程序目录下 - 打开程序自动开始渲染,生成
image.png并实时显示在窗口上 - 可以通过键盘输入调整摄像机,详见 视频
# 表示注释,可通过去掉或加上注释表示其他场景(现场景为 scene1: dragon & bunny)
#build
#camera theta phi distance
#load <obj_file_name> <material_name> r g b dx dy dz
#<geometry_name> <geometry_argument> <material_name> rgb
#material_name list: rm(reflection), rrm(refraction), srm(schlick_reflection), drm(diffuse_reflection)
#(geometry_name,geometry_argument) list: (sphere, x y z r), (triangle, ax ay az bx by bz cx cy cz)
#scene1: dragon & bunny
camera 90 -15 4.0
load bunny.obj srm 0.7 0.7 0.7 -1.4 1.0 -1.0
load dragon.obj srm 0.29 0.24 0.18 0.5 0.0 0.0
#scene2: monkey
#camera 30 -15 5.0
#load monkey.obj srm 0.1 0.1 0.1 0.0 -1.0 0.0
#scene3: glass sphere
#sphere 0 0 0 1 rrm 0.9 0.9 0.9
#scene4: two mirror spheres
#camera 30 -15 5.0
#sphere 0 0 0 1 srm 0.7 0.7 0.7
#sphere 0 1.8 0 0.6 srm 0.7 0.7 0.7
#scene5: rough sphere with mirror
#camera 60 -15 5.0
#sphere 0 0 0 1 drm 0.5 0.5 0.5
#triangle -2 -2 -1 -2 2 -1 -2 -2 3 rm 0.8 0.8 0.8
#triangle -2 -2 3 -2 2 -1 -2 2 3 rm 0.8 0.8 0.8
- 斜体表示接口,其他表示类或者模块
- 虚线箭头表示依赖关系,实线表示实现关系
- 几乎所有模块依赖
vec3和info模块,所以不再画出虚线表示
-
vec3模块: 实现三维向量vec3,通过重载运算符和函数实现常见运算- 在程序运算中表示颜色,三个分量分别对应
RGB通道 - 实现射线
ray,包括起点和方向,用于表示光线
- 在程序运算中表示颜色,三个分量分别对应
-
info模块: 实现hit_point_info,intersect_info,render_info,在各种模块之间传递信息-
hit_point_info包含与光线相交的物体表面点的位置,法向量,uv坐标 -
intersect_info包含与光线相交的物体表面点距光线起点的距离hit_point_info -
render_info包含光线的颜色值
-
-
GL模块: 将图像输出到屏幕上或者保存在png文件中 -
Buffer模块: 累计多次采样的像素点并求平均值 -
Renderer模块: 根据Camera渲染Scene- 遍历
$width \times height$ 图像的像素点,根据Camera得到的光线求Scene的颜色值
- 遍历
-
Camera模块:Camera是摄像机接口(抽象类),有抽象方法ray getSight(double _x, double _y);
- 定义了采样光线的模式
- 实现了
PerspcetiveCamera,画面符合透视法则
-
Scene模块:Scene是场景接口,有方法shared_ptr<render_info> getRender(const ray& r);
- 渲染的对象
- 实现了
StandardScene,可以向场景中添加物体并设置背景
-
BVH模块: 层次包围盒,优化求交运算。- 通过
AABB(轴对称包围盒)实现 - 重载了加法运算符以合并两个
BVH
- 通过
-
Intersecter模块: 通过包围盒树将求交运算的时间复杂度降至对数级别 -
Object模块:Object是物体接口,有抽象方法shared_ptr<intersect_info> intersect(const ray& r); shared_ptr<render_info> getRender(const vec3& rt,shared_ptr<hit_point_info> hpi, Scene* scene); shared_ptr<BVH> getBVH();
- 实现了
StandardObject,可以通过Geometry和Material构造物体
- 实现了
-
Geomerty模块:Geometry是形状接口,有抽象方法shared_ptr<intersect_info> intersect(const ray& r); shared_ptr<BVH> getBVH();
实现了
-
SphereGeometry球体 -
EllipsoidGeometry椭球体 -
TriangleGeometry三角面
-
-
Material模块:Material是材料接口,有抽象方法shared_ptr<render_info> getRender(const vec3& rt, shared_ptr<hit_point_info> hpi, Scene* scene);
实现了
-
BasicMaterial基本材料 -
ReflectiveMaterial镜面反射材料 -
DiffuseReflectiveMaterial漫反射材料 -
SchlickReflectiveMaterial石里克近似的镜面反射材料 -
RefractiveMaterial折射材料
-

