Games101-高级光线传播与复杂外观建模

本文探讨了光线追踪中的几种技术,如双向路径追踪(BDPT)、MetropolisLightTransport的统计采样、光子映射及其局限性,以及程序化生成的材质模型。重点强调了这些方法的有偏性和一致性,以及在复杂光照场景中的应用和挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Advanced Light Transport

在这里插入图片描述
无偏光线传播:BDPT,MLT
有偏光线传播:光子映射,VCM
在这里插入图片描述
做光线追踪都是在用蒙特卡洛的估计,蒙特卡洛的估计方法有些是无偏的,即蒙特卡洛估计的结果期望永远是对的(不管用多少个样本,期望永远是要的真实值)。例图之前蒙特卡洛解积分,无论用多少个样本,它的期望都是我们要的定积分的值。
所有其他情况都是有偏,即如果估计的值,期望和最后要的值不一样
特殊情况:虽然取多少个样本,最后的结果都是有偏的,但是在一个极限的定义下(如果用的样本足够多,多到无穷的情况下),期望值会收敛到真实值,虽然是有偏,但称作一致的consistent

双向路径追踪/BDPT

在这里插入图片描述
之前的路径追踪是从相机开始的路径,最后连接相机和光源。
对于双向路径追踪,会生成两个不同的半路径(子路径)。然后把两个路径的端点连接起来
在这里插入图片描述
左边是单向,右边是双向。
光线追踪里如果想找一条带有大量能量的路径,对于图中场景不太容易。因为有一个光源往上打,整个场景是被间接光所照亮的。很多时候因为路径追踪的第一个弹射是diffuse,导致不好控制它之后打到能量集中的区域去。
当光线传播集中在光源的半边比较容易算时,BDPT的效果会较好,
BDPT的问题是速度比较慢

Metropolis Light Transport

在这里插入图片描述
用一个统计学上采样的工具(马尔科夫链),即相当于当前有个样本,根据这个样本可以生成一个跟它靠近的下一个样本。
之前均匀采样是各自独立选,跟相互毫无关系。
优点是可以做到给定足够的时间,可以生成一系列以任意的函数的形状为pdf生成的样本
当采样的pdf即采样的函数和要积分的函数,即f(x)和p(x)形状一致时,得到的variance是最小的。马尔科夫链能够让任何未知函数生成一系列样本,使样本分布和被积函数形状一致。

即在给你一个采样路径的情况下,可以生成在周围相似的路径。是一个局部的方法
如上图有一条蓝色光路,对这个光路做一个微小的扰动,形成一个新的路径
在这里插入图片描述
适合做复杂/困难的光路传播,因为只要找到一条作为种子,就可以在周围不断地传播。如上图,半开的门,只有门前一小区域是被直接照亮,其他都是间接照亮。
游泳池底下的波纹形状,即聚焦现象。是非常困难的渲染情况。摄像机->水面specular->水底diffuse->水面specular->光源。
在这里插入图片描述
坏处:很难在理论上分析最后收敛的速度。不知道什么时候变成没有噪声的。
所有操作都是局部,则每个像素独立操作,有的块有的慢,导致图像看上去比较脏。
因此,更不可能用于动画,上一帧与这一帧各自有部分收敛,导致图像看上去抖的非常厉害。

Photon Mapping

在这里插入图片描述
光子映射适合用来渲染caustics(由于光线的聚焦产生的一些非常强的图案)。如果一个光打到内壁上,会把光发射到底部上。还适合做SDS
在这里插入图片描述
光子映射第一步:从光源出发,辐射出很多光子,该反射反射,该折射折射,直到光子打到diffuse的物体,就停下来。这步完成后,可以把所有光子整理起来
第二步:从眼睛/摄像机往不同方向打各种各样的路径(sub-path),该反射反射,该折射折射,直到打到diffuse的物体
在这里插入图片描述
计算局部的密度估计,建立在一个观察上,看到的物体表面,光子越集中的地方越亮。
当第二步打在diffuse物体上时,对于任何一个着色点,取周围最近的n个光子,(寻找最近邻居问题)。找n个光子所占的面的面积。密度就是光子数量n除以占据的面积
在这里插入图片描述
如果用很少的光子数量,会有很大的噪声值。用太多的光子数量,得到的结果会糊。
因为做密度估计时,想算的是一个点密度是多少,即微小面积dA有多少光子数,但我们算的是给一定光子数,算实际的面积。这两者不是一回事,所以对密度的估计是不对的估计,只有dA无线小,才是对。因此光子映射是有偏的。
当有更多的光子被打出去,覆盖的面积越小,更接近真实的dA。当有无限多的光子打出去,会得到真实的结果,所以是一致的方法
在这里插入图片描述
有偏:得到的结果相比于正确的结果是模糊的,就是有偏的
一致:虽然是有模糊的,但只要样本足够多,就会最后收敛到不模糊的结果

能否取一个面积数里面有多少个光子,理论上来说可以,但是结果永远有偏,而且不一致。不管增加多少光子,只要周围确定一个范围,范围里会找到越来越多的光子,计算的ΔA永远不会是真实结果,因为面积不变,光子数量越来越多

Vertex Connection and Merging

在这里插入图片描述
一个结合体,把双向路径追踪和光子映射结合起来。
当BDPT中两条sub-path不能直接连接的时候,将光路的端点视为光子,采用光子映射的思想将其结合

Instant Radiosity

在这里插入图片描述
实时辐射度。很多光源的方法。分析光线传播时,并不太区分光线到底是反射来的还是光源来的。都是radiance。已经被照亮的面,都认为是光源,用来照亮别人
先从光源打出很多光路,会停在某些地方,认为停止的地方变成了新的光源。如上图绿色点。用新的光源来做直接光照。即先生成VPL,用VPL当光源照亮着色点。
在这里插入图片描述
速度很快,但是有一些地方窄的缝隙会出问题,莫名其妙的发光,并且不能做glossy物体

Advanced Appearance Modeling/外观建模

在这里插入图片描述
非表面模型:散射介质,头发动物毛发,沙子
表面模型:半透明,布料,复杂模型

Non-Surface Models

在这里插入图片描述
在这里插入图片描述
雾和云。
在这里插入图片描述
当一个光在行进过程中,穿过散射介质。会被随机打到其他方向去。
光线在传播过程中会被吸收,和被反射
在这里插入图片描述
diffuse物体光线会被均匀反射。
散射物体由一个相位函数决定反射方法
在这里插入图片描述
在这里插入图片描述
头发,要考虑光线如何和一根头发作用
在这里插入图片描述
一个简单的模型 Kajiya-Kay Model
光线打到头发上会散射出一个圆锥来,同时也会被散射到四面八方去
在这里插入图片描述
效果并不好
在这里插入图片描述
光线打到头发的圆柱时,会被反射,以及穿进去折射后反射再折射出来,以及折射进入后折射出来,也就是R,TRT,TT
在这里插入图片描述
把头发看作玻璃撞的圆柱,内部有色素,会吸收能量。把头发结构分为两层,角质层和皮质层:一部分直接反射(R),一部分穿进头发,再穿出(TT),一部分穿进,内部反射,再穿出(TRT)
在这里插入图片描述
光线和多根头发作用会发生多次散射,进去出来反复,渲染困难,计算量大,应用广泛
在这里插入图片描述
动物毛发却不能直接用人的头发模型
在这里插入图片描述
从生物上的结构,头发分为角质,皮质以及髓质。人和动物的髓质差别很大,动物的髓质很大,类似散射介质,光线进去更容易发生散射,髓质是很有必要纳入计算的
在这里插入图片描述
髓质模拟的效果
在这里插入图片描述
头发加上髓质效果
在这里插入图片描述
在这里插入图片描述
双层圆柱模型,中间是髓质
在这里插入图片描述
在这里插入图片描述
Granular Material:颗粒材质在这里插入图片描述
计算量非常大

Surface Models

在这里插入图片描述
在这里插入图片描述

玉石,水母,半透明材质的代表。光线可以从某个地方进入表面,再从某个地方出来。不仅仅是半透明,光线在内部还会有折射
在这里插入图片描述
次表面散射:光线从一个点进入某个表面,再底下发生大量的散射,从另一个点出去。
在这里插入图片描述
次表面散射:对BRDF的延申
不能考虑只考虑各个方向进来的光,还要考虑各个方向进到其他点的光。要对方向积分,也要对面积进行积分
在这里插入图片描述
类似物体底下出现光源,用两个光源照亮一块,就类似此表面散射的效果
在这里插入图片描述
布:A collection of twisted fibers 由纤维缠绕而成
每一根 股(Ply) 是由 纤维(Fibers)缠绕而成
每一根 线(Yam)是由 股 (Ply) 缠绕而成
然后由线编织成布
在这里插入图片描述
根据不同的织法,给不同的BRDF
在这里插入图片描述
布料并不仅仅是表面,天鹅绒那样的效果无法展现。我们把织物认为是空间中分布的体积,空间中分布的体积→空间中细小的格子,对每个格子里布料的性质进行采样,转化成对光线的吸收和散射的渲染 (像对云的渲染那样),计算量很恐怖
在这里插入图片描述
对实际纤维,每一根渲染出来。计算量也很恐怖

当成散射介质,当成物体表面,当成真正的纤维一根根渲染,这三种方法,目前都有使用。
在这里插入图片描述
在这里插入图片描述
复杂细节材质。
渲染结果过于完美光滑,但是不真实。真实情况下,有很多复杂,不完美的东西,比如细小的划痕
在这里插入图片描述
在这里插入图片描述
微表面模型中最重要的是它的法线分布,但是我们描述这个分布基本上用的都是很简单的模型,比如正态分布之类的,但是真实的分布要更复杂。
在这里插入图片描述
定义细节
在这里插入图片描述
不同的细节
在这里插入图片描述
渲染非常的耗时
在这里插入图片描述
根本原因:认为每一个小的微表面都是个镜面,一个针孔摄像机和点光源,从摄像机打一根光线过去,打到了什么样的表面,就知道法线,知道镜面的反射方向是什么。就很难通过反射的方式打到光源上去。
从光源出发的光线同理,知道打到什么微表面,就知道反射方向,很难反射到摄像机。
在这里插入图片描述
所以考虑一个像素会覆盖很多的微表面,如果能把微表面的分布拿出来,就是在一个微小范围内把微表面的法线分布算出来,就可以替代原本光滑的分布,并且用在微表面模型里
在这里插入图片描述
考虑一个像素覆盖了多大的范围,会得到各种各样的法线分布NDF
如果一个像素覆盖了非常多的微表面,右下角的圆形,法线分布会显示出来一些统计学的规律。类似高斯分布
如果覆盖的非常少,左上角的圆形,会显示一些独特的性质。
在这里插入图片描述
而且不同类型的法线贴图,会引起不同的法线分布。

Wave Optics

在这里插入图片描述
物理上,当物体非常小时,小到和光线波长相当时,就不能假设光线时沿着直线传播。必须假设光是一个波。有衍射,干涉等现象
Recent Trend: Wave Optics
如在一个小黑屋,只用一个点光源,照亮金属片,金属片本来是一个颜色,但实际会看到有各种不同的颜色
在这里插入图片描述
拍一张白色的macbook,放大后发现不是白的
在这里插入图片描述
解波动光线。
波动光线得到BRDF和几何光线的BRDF很像,但是有自己不连续的特点。干涉会引起有的地方加强,有的地方减弱
在这里插入图片描述
在这里插入图片描述
波动光线渲染效果

Procedural Appearance/程序化生成材质

在这里插入图片描述
用一定的方式指导生成,而不需要真正的生成。可以动态的查询。不需要存储三维纹理,以免浪费很多存储量。
就类似有个空间中的函数,给任何x,y,z,可以立刻得到f值。
在这里插入图片描述
这些函数就是三维空间中的噪声函数
在这里插入图片描述
车子的锈可以生成一系列的噪声。
生成的噪声可以做一些操作。比如噪声是有些地方有有些地方没有。如果噪声认为是0到1,例如大于0.8是1,小于0.8是0。对其二值化。
只要对噪声处理得当,可以得到任意不同的效果。
在这里插入图片描述
噪声函数可以生成地形,山上的各种细节
在这里插入图片描述
也可以生成水面。不同的位置有不同的高度
在这里插入图片描述
木头纹理。控制函数是什么样,来模拟年轮,纤维等

可以把真实的物理的东西,和程序化生成结合在一块,得到非常真实的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值