games101-15-Ray-Tracing4

path tracing每个着色点考虑各个方向的光照,大量采样求积分结果,遇到漫反射物体也不会停止传播。(witted style只考虑了光线的多次弹射,不过和path tracing一样都考虑了能量守恒)。同时path tracing使用更接近物理的BRDF(考虑微表面等),可以表现更多材质(但不能处理折射),如磨砂材质(witted style漫反射材质,完美镜面反射及完全透明物体折射)。

同时,path tracing 具有软阴影。所谓阴影,就是没有直接光照只有环境光。对于witted style来说,着色点的颜色取决于最后到达的漫反射和直接光照的作用,所以是硬阴影。但是path tracing如果没有直接光照的作用,会有来自四面八方间接光照的作用,形成不同程度的阴影。

蒙特卡洛积分

求解渲染方程第一步:处理积分

解决定积分,最后得出来的是面积/体积值。当函数非常复杂,无法写出函数解析式时,考虑用蒙特卡洛积分。

黎曼积分,分解成多个长方形,取中心的xy计算长方形的面积并累加。

蒙特卡洛积分:在积分域随便取一个数xi,取其对应的yi值计算长方形面积(高度yi,宽度积分域a-b)。采样多次,并将结果平均。

image-20230719090531833

特殊情况:均匀采样,计算过程符合上述概念

image-20230719091210507 image-20230719091232712

​ 推广到任何pdf的蒙特卡洛积分形式如下,积分域已经包含在了p(x)中。

image-20230719091318655

路径追踪Path tracing

Whitted光线追踪:

1、光滑物体镜面反射

对于specular的材质正确,但是对于glossy材质,光的反射方向也会分布在镜面反射方向周围。

image-20230719133611179

2、透明物体一部分镜面反射一部分折射

3、漫反射物体光线停止

那么漫反射和漫反射物体之间的光线就没有考虑。光线到达漫反射物体应该向四面八方反射。如下图天花板应该是亮的,里面的长方体左侧应该是红色。本质还是考虑的漫反射物体和直接光照。

image-20230719134126782

解渲染方程

​ 先不考虑发光向(反射方程比渲染方程少了发光项)

image-20230719135247700

​ 对于一个场景直接光照(还是认为光照从着色点向外),从其他物体反射来的L为0。使用蒙特卡洛采样求积分。f(x)为反射方程待积分的函数,pdf为1/2Π(因为是在半球上采样,此处是均匀采样)

image-20230719140930347

​ 要计算点p到w0方向反射的光:首先按照某种pdf采样n个方向,对于每一个方向,从点p按照方向连接一根光线。如果该光线能够连接到光源,则按照渲染方程计算其值,并且将n个结果累加。

image-20230719141512966

​ 下面引入间接光照的计算:当某个方向的光线打中物体时,对于要计算的点来说,物体也是光源,要计算打中物体的光,可以对该物体递归处理。光线方向作为观察方向。Q的光照结果即P的入射光。

image-20230719142129054 image-20230719142334364

​ 上述算法问题1:递归没有停止条件。真实情况光线应该弹射无数次。但如果限制弹射次数会造成能量损失。引入的方式RR:先确定一个0-1的概率。 以一定的概率打出光线,最后结果就是L0/P,1-p的概率不打出光线,结果为0。以一定概率打不打光线,这样计算的结果期望为L0。

image-20230719144327043

​ 先选取概率P,随机生成0-1的数ksi,如果大于概率p,则不打出光线,返回0。否则打出光线进行正常计算/递归,只是结果要除以p。

image-20230719144837080

​ 上述算法的问题2:光线数量爆炸。因此为了防止光线爆炸,只随机往一个方向采样一次。N=1的蒙特卡洛积分叫路径追踪。

image-20230719142838259

​ N=1会造成很大的噪声,则从一个像素发出多条光线,将结果求平均即可。

image-20230719143516172

​ 首先选取相机位置,对于某个像素,采样N个光线。对于像素内部采样的每一个点,先生成一根光线。如果光线打到着色点p,计算着色点的颜色并且将结果累加平均。在shade函数中,视线是从着色点连接相机。

image-20230719143559807

​ 如果在像素内部采样少,计算速度快,会造成很大的噪声,需要解决该问题:

​ 如果向四面八方均匀采样,根据距离光源的远近和光源大小,打到光源的概率不同。如果一直没有打到光源,则光线浪费。

image-20230719145651328

​ 解决办法是改变采样方式,蒙特卡洛可以使用任意pdf。比起原来从着色点均匀向半球任意方向采样,此处选择从光源上进行采样。则采样的pdf是1/A(光源面积)。从光源连向着色点,该连线会与着色点法线和光源朝向的法线产生两个夹角。然而蒙特卡洛对立体角积分就应该在立体角采样,但此处是在光源采样,所以渲染方程需要写成在光源上的积分。找到dw和dA的关系即可:计算出dA在单位球的投影即为dw:

image-20230719151517402 image-20230719151840687

​ 最后着点的着色结果来源于光源直接光照和其他物体的间接光照,因此将着色分为两部分:

1、直接光照:用上述方法对光源进行采样和积分(只采样一次)

2、间接光照,使用之前的方式,引入俄罗斯轮盘赌

image-20230719152625933

细节问题:上述方法默认了光源和物体直接没有遮挡,但如果光源和物体间有遮挡,在进行直接光照的计算时,需要判断光线是否被遮挡。可以将该光线计算判断交点,如果有交点且交点为光源,则计算着色,否则直接光照的结果是0。

image-20230719152920944

路径追踪暂不考虑点光源(可以做成很小的面光源)

path tracing 属于ray tracing,还有许多其他的tracing 方法。问题还包括:如何进行均匀采样,随机数是否有要求,采用何种pdf可以得到更好的结果。能否结合光源和半球采样。对于一个像素的多个采样结果是直接平均还是加权平均,以及得到的radiance如何转化成颜色显示在屏幕。

实现过程梳理:

1、每个像素产生n条光线,最后的该像素的着色结果是n个结果的平均(实际实现时,每个像素的光线还是从相机到像素中心,后期会因为采样取不同的方向)

2、对于单根光线,先判断和场景有无交点,没有交点返回背景色/黑色

3、对于单根光线,如果和场景有交点:

(1)计算直接光照:从光源上采样一次(N=1),获得交点和pdf;在着色点和交点之间生成光线,如果没有遇到遮挡物,计算着色:L×f×cos×cosl/d^2/pdf(/N);如果遇到遮挡物,则没有直接光照这一项。

(2)计算间接光照:选取俄罗斯转盘概率p,再随机生成[0-1]的浮点数k。如果k>p,不进行迭代,无间接光照;如果k<p,在半球上采样一个方向,并且在着色点和方向上生成光线。如果该光线相交的是物体而不是光源(光源在直接光照中计算了),计算着色L×f×cos/pdf(/N)/p;L是递归的结果。

(3)最终着色结果:自发光+直接光照+间接光照。

关于自发光:如果不添加自发光则无法渲染光源。首先,光源需要正常接收间接光照。但是直接光照不会给自己提供颜色,因为着色点和采样点形成的光线与法线垂直。所以为了渲染光源,需要加上自发光。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信