Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NewRayTracing

胡言乱语

简单的光线追踪,事cpp课设

本来有vs的文件的,push不上来(悲),以后再试试

main.cpp 里是史山,不要看

需要安装 EasyX ,有个 演示视频

操作方法

  1. release 下载或者编译出程序
  2. res/ 里的 build.txtobj 模型放置在程序目录下
  3. 打开程序自动开始渲染,生成 image.png 并实时显示在窗口上
  4. 可以通过键盘输入调整摄像机,详见 视频

build.txt

# 表示注释,可通过去掉或加上注释表示其他场景(现场景为 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

代码结构

类图(好像不是

  • 斜体表示接口,其他表示类或者模块
  • 虚线箭头表示依赖关系,实线表示实现关系
  • 几乎所有模块依赖 vec3info 模块,所以不再画出虚线表示

模块设计

  • 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 ,可以通过 GeometryMaterial 构造物体
  • 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 折射材料

About

a simple RayTracing Renderer

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages