Skip to content

代码结构介绍

Chengchi Zhou edited this page Jul 1, 2018 · 4 revisions

main文件夹

main.cpp

整个项目的入口,调用core/api中实现的接口完成渲染。

core文件夹

api.cpp api.h

提供了外部调用的接口,实现了对场景的载入。场景文件的结构类似于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
      }
    }
  }
}

camera.cpp camera.h

实现了普通的相机类和带景深的相机类,用于生成初始光线。

engine.h

引擎类,子类需要重写Render函数。在engine文件夹中实现了光线追踪(rt)、光子映射(pm)、渐进式光子映射(ppm)。

geometry.cpp geometry.h

一些基本的类,如向量(Vector3)、点(Point3)、法向量(Normal3)、光线(Ray)、光子(Photon)、包围盒(AABB)、3*3矩阵(Matrix3)。

intersection.h

交点类,记录了光线和物体求交之后的一些信息,如交点、法向量等。

light.cpp light.h

光源类,分为点光源、矩形光源两种,光子映射时可用于发射光子。

material.h

材质类,用很多系数(反射、折射、高光...)来描述材质。

primitive.cpp primitive.h

物体类以及物体的集合类,Mesh部分暂时放在这里还需要改动。加速结构如kdtree继承了物体类。

raytracer.h

包含了所有需要的基本库、参数、函数,声明类。

scene.cpp scene.h

场景类,用来存放物体和光源,以及整体的求交和直接辐射度计算。

shape.cpp shape.h

形状类,是所有球、平面等形状的基类,需要实现光线求交、求交点法向量、求包围盒、求材质坐标函数。

texture.h

材质类,从材质文件中读取材质。

transform.cpp transform.h

矩阵类,用于方便地改变物体在场景中的位置大小。

accelerator文件夹

加速求交算法子类,继承自物体类。目前提供了暴力枚举和kdtree。

engine文件夹

引擎子类,光线追踪算法、光子映射算法、渐进式光子映射算法,继承自引擎类。

shape文件夹

形状子类,包含bezier曲面、无限大平面、球体、三角形,继承自形状类。