实现一个实时 Path Tracing
前言
大半年前已经开发出来但是一直没心情写博客,而且骂我的人很多,说我抄袭等等,但是这项目对我负收益,我是开源的
1.代码优化
时隔半年终于有时间写个教程
求交计算很多都可以优化简化减少计算量
2.屏幕空间
首先就是屏幕空间在一个3D场景中 只计算显示在屏幕的三角形 减少了在场景之外的三角形计算,按分辨率2000*2000=4000000个三角形需要计算,大部分是重复的我们直接记住索引,有索引标记的就光线追踪
3.光线追踪分辨率精简
在屏幕空间基础上,分辨率20002000,我们500500 可以再优化4/3的性能
4光线追踪反射分辨率精简
光线追踪有反射深度128SPP, 原本2K的分辨率,我们50*50分辨率光线追踪,可以再优化20倍的性能
5.实时 Path Tracing
路径追踪是需要多帧合成的图片,每张图片大量噪点,把合成的光线追踪结果存放在贴图坐标上(创建一个数组按贴图坐标存放),如此离线存在贴图坐标中,我们每次去噪或者以30帧后亮点微弱混合,便可看不到路径追踪的噪点(这里直接/30亮点权重不一样,后面++1才能颜色无偏差)
6.贴图坐标优化
贴图坐标有光线追踪后保存了颜色可以离线显示,没有照到的坐标是0(黑色的)摄像机移动是黑色一片片的,光线追踪这部分是大量噪点的(解决办法)用一个很小的贴图比如1010图片,混合保存光线追踪追踪
有一张大的精细的光影图片和这张小的光影图,没有照到的坐标是黑色,直接用这个小光影图的颜色(为什么用小光影图,因为一张2K分辨率的图片需要渲染10分钟,但是1张1010的颜色图片光线追踪很快)
7.降噪
从30亮点开始还是能看到轻微的噪点变动,50亮度也许看不出噪点但是需要的帧数太多所以还是需要降噪,降噪屏幕模糊,TAA,SVGF
8.超分辨率 DLSS
就是画面放大2-N倍不失真, 光线追踪最吃性能的就是分辨率,相邻的像素例如123像素1,3光线追踪,2直接混合颜色节省了1次光线追踪计算,但是混合色画面是模糊的,在1,3像素混合得出2,1,7像素混合得出4,中间5像素直接使用一个位置颜色,可以避免画面模糊,如此整个画面就减少了1半像素光线追踪或者四分之三性能将被节省
其他加速方法
多线程 CPU多的叠加性能
GPU加速 cuda
等计算通过并行显卡加速叠加性能
lod 对一个模型远处的时候低精度减少模型面数
模型反射标记 同一个标记的优先进行三角形相交计算
简化法向量 可以简化成上下左右前后方向 方向相对的再相交计算 减少了方向不相对却浪费计算三角形相交
光栅化加速 一般都说SHE BVH 个人觉得还是光栅化快
vc的编译参数使速度最大化、
加速收敛方法
随机蒙特卡洛有的地方可能永远也扫描不到,路径追踪一般使用sobol 和重要性采样
sobol 均匀地提前在一个位置中散步随机数,使得扫描得时间固定
重要性采样重要得地方多采样几次