写在前面

好久没有写文章。。不知道这次的文章能不能把想说的都表达完全。鄙人消失了快几个月了吧。。因为各种各样的原因也没有时间写下这些文字(这篇文章也是用零散时间东拼西凑出来的,望大家不要嫌弃)。

我的b站~求个关注三连~https://space.bilibili.com/198377617/?share_source=copy_link&share_medium=iphone&bbid=Y84C1A87238831C048E09014BFC2D3B481AF&ts=1587578403

本次想聊聊的是PathTracing用在Realtime渲染中的可行性与BSSRDF相关的问题。大概分为两个部分,第一部分以介绍经验为主,第二部分以鄙人最近做的一个实验为主(数学上的推导较多),希望能够和各位一起交流渲染的学习经验。

另,本文中渲染器用的是VULKAN 的API,严格来说,是从我的体素渲染器中分离的一个小分支(原本是想Raytrace SVO的来着,尴于时间不足)

使用了Compute和光栅化的Pipeline,ComputeShader进行PathTracing,光栅化全屏做后期处理。Shader总共一千多行,运行程序不含封装部分600行。

这里是目录(文章太多,目录已经不好整理了,想看之前虚幻系列的文章的话点我的头像可以查看噢)

本文结构:

一、PathTracing

二、实时PathTracing

三、BSSRDF的简介

四、BSSRDF在球面上的重要性采样的探索

一、PathTracing

何为PathTracing?顾名思义,既是路径的追踪,对光线的追踪。

本质上,PathTracing也是一种对渲染方程的求解。

这里只考虑单向的路径追踪。

按照鄙人的理解,其重要部分为:

1.与场景求交

2.获取表面属性

3.根据表面属性生成新的射线

4.累积各种路径上的能量

通常的流程如下:

1.从眼睛出发,射出一条射线(若不考虑DOF,这条射线的位置是属于特定像素区域内的,可以是随机覆盖该像素,也可以是根据某种分布进行覆盖,各有特点)

而射线方向则是当前射线位置减去相机位置

2.射线与场景求交,得到新位置

,新表面法线
,新的表面属性

累积

(E为表面自发光的强度,R为当前遮蔽积累量)
本次计算的遮蔽积累量

3.根据

等等参数,随机(蒙特卡罗的思想,这里不详细叙述)一条新射线

4.重复步骤2到3,直到射线遮蔽累积量已经过小,或者反弹次数过多

5.得到最终的Radiance,输出至屏幕

(这里使用了一个遮蔽累积量这词,是为了方便理解而创造的)

因为使用的是蒙特卡洛的算法,求的只是一个理论上无偏的近似解,但是可以看到图中有噪点。噪点的成因,直观表现为积分过程中,每个样本之间的方差

当然,为了减少方差,这里有许多方法可以使用,如ImportanceSampling(重要性采样),MIS(Multi-,多重重要性采样),RussianRoulette(俄罗斯转盘),还有一些高级一点的如可以逼近未知分布的Metropolis(本文只使用了重要性采样与多重重要性采样)。方法思想很多,从逼近真实光线分布到复用光线路径,最后的目的都是为了使用最少的路径来获取最接近正确结果的结果。

二、实时PathTracing

其实说是实时PathTracing,更准确来说应该是对未来的展望。本文中使用的渲染器,如果将分辨率调至720p以下,每帧每像素5采样(5spp),对于光路不复杂的材质(塑料,金属,玻璃),结合Temporal Filter能勉强达到能看的实时渲染。

可以看到大部分噪点都是由次表面散射的珠子提供的

当然,本文的渲染器在求交上面也偷了懒,目前只支持球和无限大的平面进行求交,而实际应用中,使用三角形来表示场景,将可能用到KDTree,BVH等的加速算法来进行求交,但是尽管如此,求交速度也会慢很多,这也是PathTracing不能实时化的原因之一。

(这是Peter and Karl's GPU path tracer,一个我在网上浏览资料时看到光线追踪器。这是一个使用CUDA可支持三角形和其他类型表达场景的光线追踪器(但是效率比较低,对比截图可以看得出来,驱动也很容易停止响应o(-`д´- 。)對,沒錯,每次截圖,就是一次驅動的崩潰)

当然还有许多许多在这方面做得很好的渲染器,鄙人就不一一列举出来。

当然除此之外还有一个思路,就是图像的去噪。这方面在这几年研究也变得更多。

1、Spatiotemporal Variance-Guided Filter(SVGF)

这是一个结合了光栅化与PathTracing的渲染有偏(虽然说最后还是理论上可以收敛到无偏的,如果直接光照也由PathTracing提供,而且静止时间足够长)的方案。简单介绍一下,SVGF需要用到光栅化提供的GBuffer的信息,来重构空间信息。使用PathTracing来获取间接光照信息(此时含噪点)。将像素颜色分为Albedo(GBuffer中获取)和Irradiance,对Irradiance进行空间上的滤波(周围像素将根据空间信息加权),进行亮度上的滤波(根据周围像素的颜色的相似性进行加权)等等,以及对之前的帧样本进行叠加(类似TAA),从而达到“不浪费之前的样本”“不浪费周围的样本”的去噪效果。

详细见文章末尾论文处。

(同时这个降噪的思想也是接下来想要努力的方向,如果还能有时间的话

2.AI降噪

来自Optix 5.0 AI-Based Denoising

如今降噪结合AI,是一个蛮流行的研究方向。。本文也不再详细叙述。

三、BSSRDF的简介

假设已经了解了BRDF,BSDF等概念,那么理解BSSRDF应该不算太苦手。

我们现实中看到的物体,通常是这样的。次表面散射这一概念,也会随着带出来。光线先经过介质折射进入表面,然后在物体内部进行散射(吸收),再从某一点射出。为了加速这一模拟过程,BSSRDF这一概念被提出(实际上与现实中有差距,具体下文会提到)

简单地理解,BSSRDF描述的是这样一个事情:对于

外一点
与射出(入)的光线方向
,可以得到的能量是多少。

因此对于每一个采样点,实际上需要求物体表面的所有点对他的贡献。其中BSSRDF被简单记叙为:

实际上通常

而eta则为介质的IOR(空气为1),F项为常见的Fresnel项

因为通常

,但是在选取表面上一点时,两点中间可能不是连续的介质(中间可能隔着空气),因此会导致最后结果与实际出现偏差,偏暗(如果是球球则不会有这样的问题啦)

因此在路径追踪中只需对

进行合理地重新选取,根据BSSRDF进行能量的累加,就能近似地模拟这种结果。

Rd函数也十分地复杂。他的积分形式(我懒得打了啦)没有解析解,因此通常使用他的近似算法来求解,如DipoleDirectionalDipole等。。

而且使用原始函数或者Dipole的形式,需要输入的参数也十分复杂:

(那个Chicken,认真的吗(((( ;°Д°)))))

(而且实现也十分复杂,如果照着论文来做的话,因为参数太多了,很容易写错o(╥﹏╥)o在这里卡了好多好多天)

本文渲染器中使用的是一种Normalized Diffusion的算法(Approximate Reflectance Profiles for Efficient Subsurface Scattering)。

该算法的核心在于这个公式

其中d是控制该函数的一个玄学参数(下面会讲到)

这个公式形式也比原来的Rd简单了不少。而且据原论文,该公式乘以

之后,是可以求出CDF的,从而可以求出
,进行重要性采样(

然而其实这个CDF的逆也没有解析解)。

使用Normalized Diffusion的渲染结果,可以看到噪点依然明显(@´_`@)

然后鄙人就有了一个大胆的想法(以下内容均为实验内容,未经允许严禁转发)

四、BSSRDF在球面上的重要性采样的探索

所需工具:Wolfram,Excel,计算器

首先使用该公式

s为scaling factor

又已知

(u是无穷,找不到那个符号了o(╥﹏╥)o)

(Albedo without the fresnel terms)

(来自Optical Monitoring of Fresh and Processed Agricultural Crops(我也不知道为什么是这个奇怪的名字))

从而得到d的近似解,

为平均散射距离

可以看到参数被简化了许多。而鄙人想做的事情,正是拟合出

的曲线,从而得到一个CDF,CDF的逆均有解析解的分布

1.求出d的常用范围

使用Wolram将Rd画出来,可以发现函数形状较d的变化会比较大

n取1~2(通常物体的Reflective Index),散射距离从1取到500:

可以发现d的取值大概分布在0.1~0.5(实际上IOR的值会大于1.2,通常为1.3,因此前面一部分骤变的曲线被舍去了)

2.根据d的取值可能拟合多条曲线

使用Excel进行运算:

得到不同的d时,r对应的

的取值。通过散点拟合,可以统一为一个形式:

3.拟合k、b

根据不同的d值,我们得到了不同的k,b值。

新建表格,对k,b值进行拟合:

实际上,运气很好的是,在选取的d的范围之内,k,b的值均为单调的(事实上再过一点点就会呈现下降趋势,不过对于选取的区域来说已经足够精确了)

又可以得到关系式:

得到完整的拟合曲线为:

4.细节处理与归一化处理

由于该函数在0处无定义,因此使用分段的形式:

(其中R为当前球的半径,因为2R为可采样的最大距离,因此需要进行截断处理,minr为自由选择的一个不等于0的极小的数,小于minr的函数值将会变得平稳,从而防止无法积分)

求出该函数在定义域内的积分:

归一化:

5.求CDF与CDF的逆

CDF同样也是一个分段函数

接下来求CDF的逆,因为是简单的指数型函数,因此求解也十分方便:

有了这个函数,我们就能通过0-1的随机变量来进行采样,返回一个距离r。

6.根据r在球面上进行采样

这一部分比较难解释。首先建立一个特殊的球面坐标系:

从一个截面上看,是这样的。经过随机采样得到了r,我们需要使采样点均匀分布在这里:

涂黑的圆盘与球面的交线,即球小圆之一,采样点应该在这上面均匀分布。

随机在球面上取一点

,取向量

可以得到采样点的位置为:

而根据高中所学知识(余弦定理),可以求得

7.PDF

根据重要性采样理论,不同分布下应该除以PDF:

从而完成重要性采样的求解。

对比使用该采样的前后图像,会发现确实有许多改进,噪点明显减少:

未使用改进后的重要性采样,1024spp
使用后,1024spp
使用前,1024spp
使用后,1024spp

https://www.zhihu.com/video/944011958136037376

https://www.zhihu.com/video/944012371203784704

(一些1080*720的实时渲染效果,视频上传中,希望压缩得不要太严重)

总结:

本次的文章和大家分享了PT的基本思想,以及实时应用的可能性。

第二段文章对于BSSRDF里面Rd函数的拟合为试验性的尝试,也获得了一点成果(命名为YCZ 分布(*/∇\*)),但是也还有许多理解不到位的地方(也请大家指出错误之处)。在分享该过程的同时,可以与大家一起加深对重要性采样的理解,感到很高兴,也希望以后还有更多这样交流的机会(鄙人也因为某些原因,下半年可能销声匿迹了,实际上,这篇文章也写了很多天,虽然渲染器只有短短的几千行。。。)

所以,请在我彻底销声匿迹之前,让我感受多几下被人赞的感受吧*(*´∀`*)☆

感激不尽!ありがとうございます!

参考文献:

1.Optical Monitoring of Fresh and Processed Agricultural Crops

2.Approximate Reflectance Profiles for Efficient Subsurface Scattering

3.BSSRDF理論と実装

4.Spatiotemporal Variance-Guided Filter

5.A Practical Model for Subsurface Light Transport

opengl光线追踪的程序_【PathTracing】实时光线追踪和BSSRDF的那些事相关推荐

  1. 速度前瞻运动控制c语言程序_整合实时运动控制及多颗相机连接,大幅提升光学影像检测速度...

    为了提升出厂产品良率,各类精密元件需要全检外观和尺寸,传统的人工检测逐渐被自动光学检测筛选设备取代,提高生产效率和检测精度.而最常使用的是光学检测筛选机,用来区分工件的良品和不良品,以及产线多相机检测 ...

  2. 动态矩阵控制matlab程序_【实时关注】你了解MATLAB吗?

    你了解MATLAB吗? MATLAB(矩阵实验室),全称为matrix laboratory.是由美国mathworks公司发布的主要面对科学计算.可视化以及交互式程序设计的高科技计算环境. 20世纪 ...

  3. 光线追踪技术 清华大学 pdf_实时光线追踪技术:业界发展近况与未来挑战

    最近阅读了SIGGRAPH 2019中 EA SEED团队带来的,关于实时光线追踪一篇很赞的技术分享[1]. 本文将以此为引子,对实时光线追踪技术的发展近况,当前业界面对的挑战,以及未来的研究方向进行 ...

  4. unity vr是加一个摄像机就行吗_Unity实时光线追踪功能演示项目创作过程

    今年3月,Unity宣布提供针对NVIDIA RTX实时光线追踪技术的支持,实时光线追踪技术为Unity的高清晰渲染管线HDRP加入了逼真的光照质量,给Unity的视觉功能赋予新的潜力. Unity中 ...

  5. KeyShot 实时光线追踪三维渲染软件

    一款很好的3D渲染软件可以给你惊人的视觉效果. KeyShot是一款为即时显示结果的实时3D渲染软件,减少了创建产品的时间.KeyShot因其速度,易用性,科学准确的材质,和先进的材质编辑能力而受到世 ...

  6. 采用光线跟踪绘制场景 c++_光线追踪的相干性聚集:硬件光线追踪的优势

    尽管在理论上实现现代GPU的方法是无限的,但真正有效的方法是切实地了解问题并着手将方案变为现实.制造现代高性能半导体器件以及试图加速当前可编程光栅化技术所面临的问题揭示了GPU硬件行业发展的未来趋势. ...

  7. ios 多线程gdc_GDC 2019中的Heretic,Megacity版本,实时光线追踪以及更多新闻

    ios 多线程gdc We kicked off GDC 2019 in the best way possible – with a keynote filled with major announ ...

  8. 英伟达发布RTX 2000系列显卡,“实时光线追踪”究竟能为游戏带来什么?

    作者 | 琥珀 出品 | AI科技大本营(公众号ID:rgznai100) "这是计算机图形学的历史性时刻!"8 月 21 日在德国科隆举办一场主题演讲上,英伟达(NVIDIA)C ...

  9. OpenGL Compute Shader Raytracing 计算着色器光线追踪的实例

    OpenGL Compute Shader Raytracing 计算着色器光线追踪 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 // #define USE_ ...

最新文章

  1. 洛谷 [P1282] 多米诺骨牌
  2. 华为鸿蒙系统2019年秋季上市,华为鸿蒙系统秋季上市?或许真的要提前了,最快可能下个月发布...
  3. Keepalived的VRRPD配置
  4. ubunttu: 使用DiskGenius克隆系统和分区
  5. 两个列向量相乘怎么计算_机器学习 线性代数基础 | 1.4 矩阵乘向量的新视角:变换基底...
  6. [JavaWeb-HTML]HTML标签_图片标签
  7. 李开复离职后谷歌将在中国消亡
  8. IDLE打开Python报错 api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案
  9. vue 引入字体图标显示方块
  10. 并发编程之CompletableFuture全网最细最全用法(一)
  11. RAP简介教程常用规则
  12. MIT.6.00.1X --Week 3 Lecture 5 -- 'Divid and conqer' algorithm 分而治之
  13. 看过1000份算法简历,才明白人工智能、机器学习、深度学习!!!
  14. 3D,小白需要理解的点云概念
  15. asp mysql 留言本_适用于ASP.NET的留言本(翻译)
  16. 计算机毕业设计Python+django 宠物领养中心小程序(源码+系统+mysql数据库+Lw文档)
  17. 关于瓦力机器人的设计构想
  18. [H5案例课程]连连看H5小游戏的制作-岑远科-专题视频课程
  19. 2018.06.27Firing(最大权闭合子图)
  20. 使用Python计算离散随机变量的熵(Entropy)

热门文章

  1. Oracle11g限制ip访问数据库,Oracle11g设置IP访问限制
  2. java多线程基础篇第一篇-JMM
  3. 500 Internal Server Error
  4. 如何用代码编写四则运算?
  5. [转载] 【python第四天】 注释和缩进
  6. git 常用命令及虚拟机服务器仓库搭建
  7. springmvc跳转到自定义404页面的三种方法
  8. oracle+110个常用函数
  9. spingMVC问题小结
  10. Win10和Ubuntu20.04双系统启动引导项修复指南