-
Notifications
You must be signed in to change notification settings - Fork 0
代码结构介绍
Chengchi Zhou edited this page Jul 1, 2018
·
4 revisions
整个项目的入口,调用core/api中实现的接口完成渲染。
提供了外部调用的接口,实现了对场景的载入。场景文件的结构类似于scss:
PPM { // 选择使用Progressive Photon mapping或者Ray Tracing进行渲染
width: 1280 // 图像宽度
height: 800 // 图像高度
photons: 200000 // 每轮每个光源发射的光子个数,如果使用Ray Tracing则不必要
Camera { // 相机,如果需要景深使用FocusCamera
eye: 2.78 2.73 -8.00 // 相机起始点
des: 2.78 2.73 0.73 // 目标位置点
up: 0 -1 0 // 相机正上方向量
}
Scene {
accelerator: kdtree // 光线(光子)求交的加速方式,缺省则使用暴力枚举
background: 0.1 0.1 0.1 // 环境光颜色
AreaLight { // 区域光源,点光源使用PointLight
origin: 2.78 5.48 1.795 // 中心点位置
focus: 2.78 0 1.795 // 聚焦点,用于实现聚光灯效果
dx: 1.05 0 0 // 光源x方向长度
dy: 0 0 1.05 // 光源y方向长度
color: 1 1 1 // 光源颜色
power: 20 // 光源亮度
scope: 0.6 // 光源聚光灯范围
}
Sphere { // 球体
origin: 0.78 0.5 2.73 // 球心坐标
radius: 0.5 // 半径
Material { // 材质
color: 1.1 1.1 1.1 // 颜色,若设为(1.1, 1.1, 1.1),即随机颜色
absorb: 0.8 0.7 0.7 // 吸收颜色,如果折射系数为0则不必须
refr: 0 // 折射系数
refl: 0.1 // 反射系数
diff: 0.5 // 漫反射系数
spec: 0.2 // 高光系数
rindex: 1.7 // 内部折射率
}
}
Plane { // 平面
normal: 0 1 0 // 法向量
dist: 7 // 与原点距离
Material {
color: 1 1 1
absorb: 0 0 0
refr: 0
refl: 0.2
diff: 0.6
spec: 0
rindex: 1.7
Texture { // 贴图
texture: ../texture/wall1.pic // 贴图文件位置
}
}
}
Mesh { // 三角面片
obj: ../obj/bunny.obj // obj文件位置
Translate { // 平移矩阵
delta: 2.5 0.1702 0.73 // 平移向量
}
RotateY { // 绕Y轴旋转,还有RotateX和RotateZ
theta: 180 // 角度
}
Scale { // 放缩矩阵
scale: 0.5 0.5 0.5 // 放缩比例
}
Material {
color: 0.8 0.7 0.7
absorb: 0.8 0.7 0.7
refr: 0
refl: 0.2
diff: 0.6
spec: 0
rindex: 1.7
}
}
Bezier { // Bezier曲面
obj: ../obj/teapot.bpt // bpt文件位置
Material {
color: 1 1 1
absorb: 1 1 1
refr: 1
refl: 0
diff: 0
spec: 0
rindex: 1.5
}
}
}
}
实现了普通的相机类和带景深的相机类,用于生成初始光线。
引擎类,子类需要重写Render函数。在engine文件夹中实现了光线追踪(rt)、光子映射(pm)、渐进式光子映射(ppm)。
一些基本的类,如向量(Vector3)、点(Point3)、法向量(Normal3)、光线(Ray)、光子(Photon)、包围盒(AABB)、3*3矩阵(Matrix3)。
交点类,记录了光线和物体求交之后的一些信息,如交点、法向量等。
光源类,分为点光源、矩形光源两种,光子映射时可用于发射光子。
材质类,用很多系数(反射、折射、高光...)来描述材质。
物体类以及物体的集合类,Mesh部分暂时放在这里还需要改动。加速结构如kdtree继承了物体类。
包含了所有需要的基本库、参数、函数,声明类。
场景类,用来存放物体和光源,以及整体的求交和直接辐射度计算。
形状类,是所有球、平面等形状的基类,需要实现光线求交、求交点法向量、求包围盒、求材质坐标函数。
材质类,从材质文件中读取材质。
矩阵类,用于方便地改变物体在场景中的位置大小。
加速求交算法子类,继承自物体类。目前提供了暴力枚举和kdtree。
引擎子类,光线追踪算法、光子映射算法、渐进式光子映射算法,继承自引擎类。
形状子类,包含bezier曲面、无限大平面、球体、三角形,继承自形状类。