Skip to content

Latest commit

 

History

History
102 lines (53 loc) · 4.21 KB

report.md

File metadata and controls

102 lines (53 loc) · 4.21 KB

Path Tracer 报告

本项目是浙江大学研究生课程《计算机图形学》的课程作业,使用 DirectX 11 的 Compute Shader 作为主要计算框架,使用 BVH 作为场景加速结构,旨在实现一个简单的路径追踪渲染器。

计算流程

本项目主要计算都在 Compute Shader 中完成, C++ 调用 D3D API 的部分不做多余解释。

加载场景

使用了 tiny_obj_loader 库用于加载 obj 模型以及相关的材质信息。加载场景的同时,计算每个三角面片的 AABB 以及 Morton Code, 用于后续加速结构的计算。

构建加速结构

本部分代码基于 karras 2012 论文实现,实现部分位于 bvh_build_cs.hlslradix_build_cs.hlsl

binary radix tree

首先在 GPU 根据场景的三角形数目,为每个三角形分配一个叶节点,并根据叶节点编号构建一个 前缀树 。其作用是将编号接近的叶节点尽可能的分配在一起,便于后续 BVH 的快速构建。

BVH

将之前加载的三角形根据其 Morton Code 进行排序,使得三角形按照其 AABB 的中心点有序排列,然后依序填入前一步构建的 前缀树 叶节点。这样得到的 前缀树 的叶节点会按照空间关系紧密分布,即,相邻的三角形在树中的距离也尽可能接近。

接下来自低而上,从叶节点开始,将两个子节点的 AABB 合并构成它们父节点的 AABB,直到根节点的 AABB 被更新后,BVH 就构建完成了。

Trace

光栅化

这里利用光栅化来完成视线与场景的第一次求交,加速计算过程。

通过在光栅化管线中保存 GBuffer 来保存像素点对应的场景材质、法线、坐标信息,代替第一次光线追踪过程。

追踪

将光栅化得到的 GBuffer 传给 Compute Shader,CS 借此信息计算出当前光线的颜色、与场景交点的材质、法线信息,从而计算出下一次 bounce 的信息,多次循环直到超过迭代限制或者命中光源。

累加

CS 在输出颜色的过程中可以读取上一次计算的结果以及当前累计计算的帧数,从而计算平均数实现多次采样。

关键算法

核心算法都位于 ray_tracing.hlsl

场景求交 (BVH)

根据输入的光线,从 BVH 树的根节点开始,与当前节点的 AABB 求交,如果有交点,则遍历其子节点;如果节点是叶节点,则对其对应的三角形求重心坐标,确定是否相交。最后取与光线原点最近的交点作为结果返回。

Bounce

针对漫反射、高光、折射分别进行处理

漫反射

以交点法线为中心进行半球面随机采样,发射光线。

高光

根据 phong 分布,以反射角方向为中心,根据高光系数进行重要性采样。用一个 hack 模拟了各向异性反射效果。

折射

根据折射系数计算出射光线方向(根据内外方向调整折射率系数),考虑全反射和菲涅尔反射。

均匀分布

根据当前采样的次数编号,均匀分布随机数的值,提高采样的质量。

提前终止

为了避免过多次数的迭代,引入了轮盘的策略,提前结束部分光线的迭代,但是对没有被终止的光线增加了权重来保证结果无偏。

后续改进

以下功能尚未完成

  • 光栅化处理( Primary Ray )的阶段会产生锯齿,导致后续处理都带有锯齿,需要在光栅化过程中加入抖动来消除。
  • 玻璃材质的光照效果有偏,需要纠正
  • 高光的重要性采样有误,需要纠正
  • 高光材质可以增加一个各向异性参数

操作

可执行程序位于 runtime 目录

启动程序时会询问打开哪个 obj 文件,不选择的话可以用同目录下默认的 scene01.obj;

启动后默认不开始trace,可以通过 WASD IJKL 调整相机参数,拖拽窗口改变渲染分辨率,确定之后勾选 ray 选项开始trace,勾选 ACC 选项开始累加效果,点击 save 按钮保存当前结果到 BMP 图片。

调整相机位置之后需要重新勾选累加选项以重置。

结果

性能

在 1060 显卡上,1kX1k分辨率下可以达到约14帧/s的采样速度,即 14M samples/s

效果

见 snapshot 目录