zt3ff3n 发表于 2021-11-16 15:49

为什么光线追踪会出现噪点,为什么需要蒙特卡洛?

最近正在学习光线追踪,在这里谈谈对噪点的理解。
光线追踪是不是一定会出现噪点?
首先光线追踪是不是一定会出现噪点呢?答案是并不一定,比如下面这三张图都是我用光线追踪算法生成的,左边的图没有任何噪点、中间的图有大量的噪点,右边图有少量不明显噪点。左边图是我一开始还不太了解光线追踪时自己瞎搞的光线追踪器生成的,虽然图中并没有任何噪点,但是看起来极不自然、真实;中间和右边图是基于路径追踪算法生成,看起来比较接近真实,但是中间的图由于采样不足导致出现大量的噪点。生成三幅图的算法在上层光线生成部分是相同的,主要的差别是光照计算方式和每个象素的采样数量。左图采用phong光照模型,只追踪计算了镜面反射的光线路径积分,每个象素只做了一次采样;而中间和右图采用的是BRDF既计算了镜面反射也计算了漫反射的光线路径积分,但是生成这两幅图时每个象素的采样数量不同,中间的图是10,而右边的图是1000。



光线追踪渲染对比

光线追踪,按照原理来说,是逐个像素进行判断,那么有没有打到物体应该是个确定的事件,为什么我看到很多光线追踪一遍下来,圆形中间也会有白色噪点?虽然逐象素发出光线、光线是否与物体相交是确定的,但是仅有相交信息并不能计算出该点的颜色。那么光线与物体表面交点的颜色该如何计算呢?现代光线追踪或光栅化渲染一般都通过求解渲染方程而得到交点的颜色。
渲染方程: https://www.zhihu.com/equation?tex=L_%7Bo%7D%28p%2Cw_%7Bo%7D%29%3DL_%7Be%7D%28p%2Cw_%7Bo%7D%29%2B%5Cint_%7B%5COmega%7Df_%7Br%7D%28p%2Cw_%7Bi%7D%5Crightarrow+w_%7Bo%7D%29L_%7Bi%7D%28p%2Cw_%7Bi%7D%29cos%5Ctheta+dw_%7Bi%7D
该方程的物理意义是某p点的出射光颜色等于该点自发光的颜色加上反射颜色,而反射颜色等于该点所有入射光线的某种分布,这里入射光线指因镜面反射、折射和漫反射产生的光线。
噪点是如何产生的?
产生噪点主要有两个原因,积分过程中光线采样不足及生成入射光线样本与真实光线的分布有偏差。
在光线追踪过程中,如果能精确的求解出渲染方程,算出每个点的反射颜色,那么渲染出的图片接近真实照片,不会出现噪点。在求解方程的过程中,对于每个点反射光线的颜色是自发光颜色+反射光颜色,对于自发光部分一般为一个常数值,而反射部分则是一个半球上的积分计算。对于理想镜面反射,光线的反射只在一个方向上有值,并不需要生成很多样本去做积分运算,可以做特殊处理,但是对于漫反射部分,如果要精确的计算出结果,则需在对入射到该点的半球面上的所有光线做积分运算,而直接求解该方程的积分比较困难,在实际光线追踪应用中则是使用蒙特卡罗的方式近似求解。而在积分过程中需要采样大量的光线样本才能让积分收敛接近真实值,如果采样不足或者生成的光线样本分布与真实光线的分布存在偏差就可能会出现噪点。
如何填补这些噪点?
噪点是因为采样引起的,因此我们可以改进采样来降低它,其中改进采样最简单有效的解决办法是提高光线采样数量,对于路径追踪来说,就是提高每个像素点随机生成的光线路径数量。但是提高采样数量一方面会增加计算时间,另一方面采样数量与噪点收敛并不成线性比例,采样数量提高到一定程度后,噪点降低的幅度变化很小。如下图是每个象素不同的采样数量下使用路径追踪生成的图片对比,从左到右分别对应的每个象素采样为1、16、256、4096、65536,可以看到,随时采样数量的提高,噪点变得越来越少。但是如果放大来看,就算采样为4096的图片上也会有噪点。



每个象素不同的采样数量下使用路径追踪生成的图片对比

另外一种改进采样的方法是重要性采样(Importance Sampling),由于均匀采样(Uniform Sampling)生成的光线样本在各个方向上概率都相同,并不会对灯光特殊对待。在实际应用中,如果能让随机生成的光线样本有极大的概率偏向灯光的方向也可以减少噪点。为了防止对灯光的过度采样,我们还需要对采样的结果用概率密度函数(pdf-probability density function )做权值调整。这种非均匀采样,再对采样结果用pdf加权调整的方式叫重要性采样。下图展示了路径追踪采用均匀采样、灯光重要性采样及混合均匀采样与灯光重要性采样生成图片的对比,最左边是均匀采样、采样数量为400,中间是区域灯光重要性采样,采样数量是10,最右边是混合了区域灯光采样与均匀采样,采样数量为400。从图上可以看出,在同样采样数量下,均匀采样比重要性采样生成的图噪点更多,另外、灯光重要性采样虽然在较低的采样数量下生成的图片噪点很少,但是生成的图片并不真实,最明显的是中间图的天花板和两个箱子的暗面为纯黑色,效果并不是很好。



不同采样方法的光线追踪对比

另外除了改进光线采样外,还可以对最终生成的图像做后期处理以实现降噪,比如一个简单的办法是对采样生成的图像做双线性插值。
大量的采样耗时较高,最近在光线追踪领域研究得比较多的是去噪算法(Denoising),在 @文刀秋二 的这篇文章中有提过,即通过Denoising算法,将极低采样的光线追踪结果重建(Reconstruct)出非常接近用大量采样渲染得到的收敛后的图像。
参考


[*]^RealTimeRendering第26章http://www.realtimerendering.com/Real-Time_Rendering_4th-Real-Time_Ray_Tracing.pdf
[*]^光线追踪与实时渲染的未来https://zhuanlan.zhihu.com/p/34851503

NoiseFloor 发表于 2021-11-16 15:54

最近正在学习光线追踪,在这里谈谈对噪点的理解。
光线追踪是不是一定会出现噪点?
首先光线追踪是不是一定会出现噪点呢?答案是并不一定,比如下面这三张图都是我用光线追踪算法生成的,左边的图没有任何噪点、中间的图有大量的噪点,右边图有少量不明显噪点。左边图是我一开始还不太了解光线追踪时自己瞎搞的光线追踪器生成的,虽然图中并没有任何噪点,但是看起来极不自然、真实;中间和右边图是基于路径追踪算法生成,看起来比较接近真实,但是中间的图由于采样不足导致出现大量的噪点。生成三幅图的算法在上层光线生成部分是相同的,主要的差别是光照计算方式和每个象素的采样数量。左图采用phong光照模型,只追踪计算了镜面反射的光线路径积分,每个象素只做了一次采样;而中间和右图采用的是BRDF既计算了镜面反射也计算了漫反射的光线路径积分,但是生成这两幅图时每个象素的采样数量不同,中间的图是10,而右边的图是1000。



光线追踪渲染对比

光线追踪,按照原理来说,是逐个像素进行判断,那么有没有打到物体应该是个确定的事件,为什么我看到很多光线追踪一遍下来,圆形中间也会有白色噪点?虽然逐象素发出光线、光线是否与物体相交是确定的,但是仅有相交信息并不能计算出该点的颜色。那么光线与物体表面交点的颜色该如何计算呢?现代光线追踪或光栅化渲染一般都通过求解渲染方程而得到交点的颜色。
渲染方程: https://www.zhihu.com/equation?tex=L_%7Bo%7D%28p%2Cw_%7Bo%7D%29%3DL_%7Be%7D%28p%2Cw_%7Bo%7D%29%2B%5Cint_%7B%5COmega%7Df_%7Br%7D%28p%2Cw_%7Bi%7D%5Crightarrow+w_%7Bo%7D%29L_%7Bi%7D%28p%2Cw_%7Bi%7D%29cos%5Ctheta+dw_%7Bi%7D
该方程的物理意义是某p点的出射光颜色等于该点自发光的颜色加上反射颜色,而反射颜色等于该点所有入射光线的某种分布,这里入射光线指因镜面反射、折射和漫反射产生的光线。
噪点是如何产生的?
产生噪点主要有两个原因,积分过程中光线采样不足及生成入射光线样本与真实光线的分布有偏差。
在光线追踪过程中,如果能精确的求解出渲染方程,算出每个点的反射颜色,那么渲染出的图片接近真实照片,不会出现噪点。在求解方程的过程中,对于每个点反射光线的颜色是自发光颜色+反射光颜色,对于自发光部分一般为一个常数值,而反射部分则是一个半球上的积分计算。对于理想镜面反射,光线的反射只在一个方向上有值,并不需要生成很多样本去做积分运算,可以做特殊处理,但是对于漫反射部分,如果要精确的计算出结果,则需在对入射到该点的半球面上的所有光线做积分运算,而直接求解该方程的积分比较困难,在实际光线追踪应用中则是使用蒙特卡罗的方式近似求解。而在积分过程中需要采样大量的光线样本才能让积分收敛接近真实值,如果采样不足或者生成的光线样本分布与真实光线的分布存在偏差就可能会出现噪点。
如何填补这些噪点?
噪点是因为采样引起的,因此我们可以改进采样来降低它,其中改进采样最简单有效的解决办法是提高光线采样数量,对于路径追踪来说,就是提高每个像素点随机生成的光线路径数量。但是提高采样数量一方面会增加计算时间,另一方面采样数量与噪点收敛并不成线性比例,采样数量提高到一定程度后,噪点降低的幅度变化很小。如下图是每个象素不同的采样数量下使用路径追踪生成的图片对比,从左到右分别对应的每个象素采样为1、16、256、4096、65536,可以看到,随时采样数量的提高,噪点变得越来越少。但是如果放大来看,就算采样为4096的图片上也会有噪点。



每个象素不同的采样数量下使用路径追踪生成的图片对比

另外一种改进采样的方法是重要性采样(Importance Sampling),由于均匀采样(Uniform Sampling)生成的光线样本在各个方向上概率都相同,并不会对灯光特殊对待。在实际应用中,如果能让随机生成的光线样本有极大的概率偏向灯光的方向也可以减少噪点。为了防止对灯光的过度采样,我们还需要对采样的结果用概率密度函数(pdf-probability density function )做权值调整。这种非均匀采样,再对采样结果用pdf加权调整的方式叫重要性采样。下图展示了路径追踪采用均匀采样、灯光重要性采样及混合均匀采样与灯光重要性采样生成图片的对比,最左边是均匀采样、采样数量为400,中间是区域灯光重要性采样,采样数量是10,最右边是混合了区域灯光采样与均匀采样,采样数量为400。从图上可以看出,在同样采样数量下,均匀采样比重要性采样生成的图噪点更多,另外、灯光重要性采样虽然在较低的采样数量下生成的图片噪点很少,但是生成的图片并不真实,最明显的是中间图的天花板和两个箱子的暗面为纯黑色,效果并不是很好。



不同采样方法的光线追踪对比

另外除了改进光线采样外,还可以对最终生成的图像做后期处理以实现降噪,比如一个简单的办法是对采样生成的图像做双线性插值。
大量的采样耗时较高,最近在光线追踪领域研究得比较多的是去噪算法(Denoising),在 @文刀秋二 的这篇文章中有提过,即通过Denoising算法,将极低采样的光线追踪结果重建(Reconstruct)出非常接近用大量采样渲染得到的收敛后的图像。

pc8888888 发表于 2021-11-16 15:58

好多回答满屏的数学公式。。。
虽然数学是最严谨的,但是如果是想要看公式的话我估计题主也不来问了。另外,学了之后如果还是只能搬公式回答,那么要么是数学太NB,已经变成日常使用语言了;要么就是其实没学懂,只是在死记硬背。
为什么会出现噪点?因为像素是有面积的,但是计算的时候只是取这个面积当中的一个或者一些点开始射出光线。也就是说,这是一个抽样检查,而不是全样本检查。
50个鸡蛋里面有3个坏的。现在抽5个,那么有可能能抽到一个以上的坏的,也有可能抽不到。
对于不同的像素,重复这个过程,就好比对于不同的批次的鸡蛋重复进行这个抽样检查。结果自然是有的运气好查出来了有的运气不好没查出来。即便其实每批鸡蛋其实都是3个坏的,但是最终抽样的结果却是分散的,这就是噪点的来源。
至于蒙特卡洛,就是在抽样当中寻找一个妥协点。如果抽样本身是随机且样本数足够大,则会出现一种趋势,也就是样本会满足某种概率分布,那么自然可以推算出一个中间值。这个中间值相对于任意一个具体的样本,在样本间的漂移更小,更能体现被采样空间在这个像素面积(体积)当中的总体情况。
另外,计算机浮点数的精度也是一个很重要原因。
仅此。

super1 发表于 2021-11-16 16:00

来看公式


这里的方差第一跟N有关,N越大,方差越小
第二跟Y有关,Y的形状决定了最后的方差。但是Y并不是之前的,而是 https://www.zhihu.com/equation?tex=%5Cfrac%7Bf%28x%29%7D%7Bp%28x%29%7D ,那么最后这个函数的样子就和之前不一样了。可能是无穷大,也可能是0!
为什么呢,如果你的= https://www.zhihu.com/equation?tex=cf%28x%29 ,c的作用是使得累计积分为1。这样选择后,带入之后上下就把约去了,这时求的方差是对常数的方差,也就是均匀分布,方差就是0。如果你选的不好,可能最后的函数形状变的非常的陡峭,最后方差非常大。
光线追踪中你求的那个积分是不可能提前知道c的,因为c是 https://www.zhihu.com/equation?tex=%5Cint_%7B%5COmega%7Df_r+L_rcosd%5Comega 的值的倒数,你本来就是要求它的,所以没办法找到这么完美的解决方案。
即便如此,的选择仍然尤为重要,你走势越像,你最后的方差就越小(越像均匀分布)。
所以蒙特卡洛就是使用来减小方差的。
而所有的后来改进的光线追踪的算法,都是改进的,从而改变采样点的分布,得到更好更快的收敛。

kirin77 发表于 2021-11-16 16:04

具体请看 The Monte Carlo Estimator。以下是图形学萌新瞎逼逼。
因为光线追踪,确切地说是路径追踪(Path Tracing)本质上是在解渲染方程,一个积分方程(The Light Transport Equation)。
这个方程很明显,大部分情况下是只能估计数值解的。用蒙特卡洛是因为其他数值积分算法随着维数的增加效率指数下降(光线每多一次bounce就多一维)。正如其他答案所说,噪点源自方差,有方差是因为我们不能直接对integrand(应该是这个词吧)进行重要性采样。
随着采样数的增加,方差会以 https://www.zhihu.com/equation?tex=%5Cmathcal%7BO%7D%28%5Cdfrac%7B1%7D%7BN%7D%29 下降(应该吧),噪点就慢慢消失。可以通过对光源,BRDF进行重要性采样以及多重重要性采样(Multiple Importance Sampling),低差异序列减少方差。
如果完全是确定性的光线追踪(比如whitted ?),但是还是有噪点,那是因为,。。浮点误差导致的self intersection

kirin77 发表于 2021-11-16 16:08

光线追踪是一种计算密集型渲染技术,能够真实模拟场景照明效果和场景物体。它与之前计算光源光线传播路径不一样,利用光的可逆性质,反向计算,跟踪从眼睛发出的光线,通过技术生成编排好的数学模型展现出来,这样的得到画面效果更佳,对于反射与折射有更准确的模拟效果,并且效率非常高,因此在电影制作过程往往会采用这种高质量的渲染方式。
但光线追踪对算力要求极高,计算量非常庞大。光栅图形学中的算法,利用了数据的一致性从而在像素之间共享计算,而光线跟踪通常是将每条光线当作独立的光线,每次都要重新计算。所以尽管电影特效工作室有庞大的计算集群,但他们也会“偷懒”,只有在关键帧、关键元素上采用光线追踪来处理,其余部分依然使用光栅化进行渲染,依然能够提供非常出色的画面效果。由此可想而知计算量之大。
每一条光线都有自己的计算,可以正确地处理出光线反射、折射等光学现象,但实际出来的效果有可能与真实情况不一样。这因为最终的画面是求解通过渲染方程得到,但有时候方程式解不出来,只能利用蒙特卡洛积分做近似解,需要用到大量的样本进行求解,在电影使用的离线渲染中,由于没有计算时间限制,他们通常会采用几百到几千以内大样本进行计算,出来的光线追踪效果会更好。



为什么会有噪点 ?
在求解渲染方程时,需使用蒙特卡洛采样:


上式Estimator中的每一项都是半球域上的复杂函数入射辐亮度(Incoming radiance) L, 可见性V, BRDF f, 采样密度分布函数p当前硬件条件下,每像素至多几十个采样(spp/samples per pixel)低采样率导致Estimator的高方差,表现为噪点
NVIDIA针对极低样本数量的光线追踪结果进行实时降噪的研究,并且取得了不错的结果,通过Denoising算法,可以用比较低样本的光线追踪应用到实时渲染中,最终渲染质量可以媲美大样本下的光线追踪收敛图像。
另一方面,作为十多年来架构发展的重大飞跃,Turing 架构推出全新核心 GPU 架构,可大力提升 PC 游戏、专业图形应用程序和深度学习推理的效率与性能。 通过采用基于硬件的全新加速器和混合渲染方法,Turing 架构将光栅化、实时光线追踪、 AI 和模拟技术融于一身,可在 PC 游戏中实现令人难以置信的真实感、由神经网络驱动的全新惊艳效果、电影级交互体验,并可在用户创建和浏览复杂 3D 模型时为其提供流畅的交互性。

zt3ff3n 发表于 2021-11-16 16:16

题主的题干有点点问题,噪点就是蒙特卡洛造成的啦。
如果我想知道物体表面一个点接收到的从各个方向射过来的光线,我需要把180度球面每一个方向的光的强度值都加起来,但是事实上这里有无数个方向,那怎么办呢
一个nave的想法就是随便找一些方向的光然后加起来,我们叫这些方向是采样,一些固定的方向的采样当然不能代表无限的球面无数个方向
于是蒙特卡洛说我们每次都随机取一个方向,然后不停重复这个过程,取无限次随机就会接近真实的球面积分!
结果我们并没有取无限个采样,导致每个像素都取了很随机的值,每个像素都很随机的相差于真实值,看起来就是噪点。
光线追踪的收敛速度是o(根号n),n是采样数

LiteralliJeff 发表于 2021-11-16 16:18

根据强大数定理(Strong Law of Large Numbers),对于分布 https://www.zhihu.com/equation?tex=X_1%2CX_2%2C%5Cdots+X_n%5Csim+i.i.d 且 https://www.zhihu.com/equation?tex=%5Cmathbb%7BE%7D_p%5BX_i%5D+%3D+%5Cmu+%3C+%2B%5Cinfty ,有 https://www.zhihu.com/equation?tex=%5Clim_%7Bn+%5Crightarrow+%2B%5Cinfty%7D+%5Cfrac%7B1%7D%7Bn%7D%28X_1%2BX_2%2B%5Cdots+X_n%29+%3D+%5Cmu%2C+%5C+a.s.
所以对于一个可测函数 https://www.zhihu.com/equation?tex=f 和随机变量 https://www.zhihu.com/equation?tex=X+%5Csim+p%28x%29 , https://www.zhihu.com/equation?tex=%5Cmathbb%7BE%7D_p%5Bf%28X%29%5D+%3D+%5Cint%5Climits_%7B%5Cmathbb%7BR%7D%5Em%7Df%28x%29p%28x%29dx ,可以采样多个 https://www.zhihu.com/equation?tex=X_i+%5Csim+p ,作为近似解: https://www.zhihu.com/equation?tex=%5Cmathbb%7BE%7D_p%5Bf%28X%29%5D+%5Capprox+%5Cfrac%7B1%7D%7BN%7D%5Bf%28X_1%29%2Bf%28X_2%29%2B%5Cdots+f%28X_N%29%5D .
比如我们可以对 https://www.zhihu.com/equation?tex=X%5Csim+U%280%2C1%29 简单采样、或者对 https://www.zhihu.com/equation?tex=X%5Csim+N%280%2C1%29 采样、对半球面均匀采样。那么很多时候 https://www.zhihu.com/equation?tex=p 很复杂很难采样,我们也可以用简单的拒绝接受采样或者MCMC采样,图形学里用的多的是重要性采样。
例如,对于 https://www.zhihu.com/equation?tex=Y+%5Csim+q 的采样是已知的,或者说较为简单,那么: https://www.zhihu.com/equation?tex=%5Cmathbb%7BE%7D_p%5Bf%28X%29%5D+%3D+%5Cint%5Climits_%7B%5Cmathbb%7BR%7D%5Em%7D+f%28x%29p%28x%29+dx+%3D+%5Cint%5Climits_%7B%5Cmathbb%7BR%7D%5Em%7D+f%28x%29+%5Cfrac%7Bp%28x%29%7D%7Bq%28x%29%7D+q%28x%29+dx%3D%5Cmathbb%7BE%7D_q%5Bf%5E%7B%2A%7D%28X%29%5D
转为估计 https://www.zhihu.com/equation?tex=%5Chat%7B%5Cmu%7D_q+%3D+%5Cfrac%7B1%7D%7BN%7D%5Csum%5Climits_%7Bi%3D1%7D%5E%7BN%7D%5Cfrac%7Bf%28X_i%29p%28X_i%29%7D%7Bq%28X_i%29%7D%2C+%5C+X_i+%5Csim+q .
记 https://www.zhihu.com/equation?tex=%5Cmu_n+%3D+%5Cfrac%7B1%7D%7Bn%7D%5Csum%5Climits_%7Bi%3D1%7D%5En+X_i ,则 https://www.zhihu.com/equation?tex=%5Cmathbb%7BE%7D_p%5B%28%5Cmu_n-%5Cmu%29%5E2%5D+%3D+%5Cfrac%7B%5Csigma+%5E2%7D%7Bn%7D ,两边开根号,Monte Carlo方法的误差阶为 https://www.zhihu.com/equation?tex=%5Cmathcal%7BO%7D%28n%5E%7B-1%2F2%7D%29 .

pc8888888 发表于 2021-11-16 16:26

噪点是方差导致的,至于什么是方差,为神马会有方差,看书吧,pbr

yukamu 发表于 2021-11-16 16:34

谢不邀。
因为一条光线射进物体表面,会有“无数”条光线射出来。
所以需要采样。
因为样本数量总是有限,所以会有噪声。
页: [1] 2
查看完整版本: 为什么光线追踪会出现噪点,为什么需要蒙特卡洛?