# RayTracing **Repository Path**: stringi/ray-tracing ## Basic Information - **Project Name**: RayTracing - **Description**: 图形学大作业:参考《Ray Tracing in a weekend》,完成一个能够实现对复杂场景进行光线跟踪的程序,并在此基础上进行优化,加速光线追踪过程。不知道为什么图片显示不出来,不过下载以后可以看到 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-03-21 - **Last Updated**: 2025-03-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 一、实验目的 1. 掌握并实现光线跟踪算法; 2. 掌握并实现基本的光照模型; 3. 掌握并实现光线跟踪的加速方法; ## 二、使用的工具软件及环境 建议使用Microsoft Visual Studio 2017+。 额外用到的库: - [**CImg**](http://cimg.sourceforge.net)、[**stb_image**](http://nothings.org/stb_image.h):用于读取、保存图片文件 - [**FLTK**](http://www.fltk.org/str.php):轻量级图形界面 ## 三、实验内容 1. 阅读参考资料《Ray Tracing in One Weekend》《Ray Tracing: The Next Week》《Ray Tracing: The Rest of Your Life》 2. 完成光线跟踪程序 简略版流程: - 查看电脑CPU核数,设为n,开启2n个线程,将所需图片水平分成2n份,每个线程负责一份 - 每个线程遍历每个像素点,对每个像素点采样若干次(次数由场景中设定)以实现蒙特卡洛采样 - 每次采样时,从相机光心处到像素点处的射线构成视线,对整个场景和视线求交(遍历或用BVH树),得到最近的交点 - 从最近交点处计算得到反射视线,递归进行求交,直到光线碰到光源或进入无穷远或达到递归次数上限,返回当前视线颜色 - 在调用栈上的每个碰撞点根据返回的颜色值和使用的光照模型计算自己的颜色,并最终得到像素点处本次采样颜色值 - 将多次采样得到RGB颜色的几何平均值作为该像素点的最终颜色 更详细的程序文档:https://dynalist.io/d/cv59dWfJsaUtsKfwDfu6hMaQ ## 四、继续优化以加快光线求交的思路 优化的目标是加快程序中光线和曲面求交的模块的运行速度。有两种基本思路: 1. 专攻并优化光线跟踪的相交测试,使程序运行尽可能的快速 - 可以对代码中Hitable的子类RotateX、RotateY、RotateZ、Translate进行重构,用矩阵堆栈将多次矩阵乘法压缩到1次,可以极大加快反复旋转、平移过的元素的光线求交。(尚未实现) - 可以改进特定纹理贴图如棋盘格、Perlin的计算速度。(未实现) 2. 改进加快求交查询的数据结构(已实现BVH): - 将BVH构造函数使用的排序比较器的规则从比较包围盒坐标最小值改为比较包围盒坐标中点。(已实现) - 将BVH构造方法改为基于表面积的启发式评估划分方法(Surface Area Heuristic,SAH)的近似最优的层次包围盒构造算法。(已实现) ## 五、场景渲染结果 以下图片渲染参数均为递归次数15、宽度512 ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image002.jpg) 如果运行和编译本程序时使用不同计算机,可能导致显示的结果泛白(如上图),初步估计由FLTK导致,尚未找到具体原因。 ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image004.jpg) 以下图片递归次数均为4 ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image006.jpg) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image008.png) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image010.png) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image012.png) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image014.png) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image016.png) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image018.png) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image020.png) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image022.png) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image024.png) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image026.png) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image028.jpg) ![img](https://gitee.com/stringi/ray-tracing/raw/master/README.assets/clip_image030.jpg)