1 Star 2 Fork 0

ningyao11 / pathTracing_OPENGL

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 3.50 KB
一键复制 编辑 原始数据 按行查看 历史
ningyao11 提交于 2022-08-17 02:12 . endend

pathTracing_OPENGL

安装教程

--亲测 Visual Studio 2019, Visual Studio 2022 可以使用;

--运行前一定要选择 Release x64

--打开 opengl.sln 文件 选择Release x64 运行

--(.sln是通过vs2022创建的,如果使用的是其他版本的,需要修改平台工具集到对应版本,比如vs2019需要点击项目的属性,平台工具集v143修改成v142,否则可能会报错)

--第三方库 GLEW, GLAD, stbi_image, Eigen ,OBJ_Loader ;

--实测20万三角形,每秒10帧左右(NVIDIA Geforce GTX 1650)

介绍

--是一个基于物理的路径追踪渲染器;

--原理:从光线起点出发,击中所有物体中最近一个点,该点的颜色取决于半圆面内所有方向的光对该点的贡献和,方程 L =∫ f(n,i,o)L(i)(i·n) d(i);

==Cook-Torrance模型BRDF:fr=Ks*F_lambert+F_s;

降噪方法:超采样,重要性采样,联合双边滤波;

优化方法:BVH建树进行SAH优化,从摄像机出发的光线和世界物体第一次求交利用光栅化完成,开启背面剔除,LUT;

--实现了基于物理的BRDF和BTDF材质;

--主要的文件介绍

1.CodeBaseClass/material.h 实现了一个Material类,该类是物体的材质,主要由albedo,metallic,roughness组成;

2.CodeBaseClass/bvh.h 该文件只有一个函数,函数接收一个三角形数组,以三角形的包围盒为叶子结点建立一个包围盒树,,对三角形进行排序最终组成一个包围盒树的数组(树以数组的形式而不是指针的形式构造,因为数据传入到GPU指针失效)

3.CodeBaseClass/camera.h 只有一个Camera类 存储了摄像机的状态,根据状态返回摄像机的VP矩阵,提供控制摄像机的函数

4.CodeShapeClass 中的文件实现了模型读取,基础的圆球,正方体,圆柱形状,可以自动创建和释放VAO,VBO,EBO,并且实现了5个简单的场景;

5.CodeShaderClass/shader.h 实现了Shader类,该类可以组合顶点着色器,几何着色器,片元着色器成一个着色器程序,并且对着色器程序中的uniform进行写入.

6.CodeShaderClass/framebufer.h 实现了Frame类,该类可以自动创建帧缓冲,读入和创建和释放帧缓冲中的数据

7.CodeShaderClass/texturemanager. 实现了TextureManager类 自动的创建和释放纹理缓冲

8.main.cpp是项目的入口,该文件顺序的做了以下这些事情

8.1.加载摄像机,

8.2.初始化OPENGL环境,

8.3.加载场景数据(50行可以修改场景),

8.4.创建三角形,包围盒树,材质数组,

8.5.加载3个阶段的着色器程序并且传入恒定不变的数据,

8.6.创建2个帧缓冲着色器

8.7.开始渲染阶段,开启深度测试,绑定帧缓冲,传入uniform数据,调用Draw

9.CodeGLSL/frag1.glsl是最核心的部分。接受CPU传入的三角形,包围盒树,材质,摄像机位置等数据,接受顶点着色器传入的位置,法线等数据进行路径追踪。

路径追踪接受一个光线,然后该光线和世界所有物体求交:首先和根包围盒求交,如果击中,则和左子树右子树的包围盒求交(GLSL函数循环调用,所以引入栈的方法进行调用),直到包围盒没有子包围盒了,此时和包围盒的三角形求交把并且返回最近的交点。

如果和世界物体有交点,根据该点的材料,若是金属材料,需要对下一个光线方向进行重要性采样,计算BRDF和PDF,更新下一个光纤,继续下一步的路径追踪。

参与贡献

C++
1
https://gitee.com/ningyao11/path-tracing_-opengl.git
git@gitee.com:ningyao11/path-tracing_-opengl.git
ningyao11
path-tracing_-opengl
pathTracing_OPENGL
master

搜索帮助