games101-15-Ray-Tracing3

Irradiance

​ 每单位照射面积所接收到的能量。此处面积必须与光线垂直,如果是不垂直的光线,需要类似Blinn-Phong的漫反射光照,乘以一个cosθ。

image-20230514134205834

​ 当光线垂直照射平面时,如上图左边所示,照射到平面上的面积与光线本身垂直。但当光线斜着照射到平面时,此时真正与光线垂直的面积为A2cosθ。

image-20230514140908635

​ 对于之前Blinn-Phong的例子,此处认为光每单位时间辐射出来的能量是一个定值,这些能量会均匀分布在球壳上,所以对于单位为1的球壳和单位r的球壳,总能量都是Φ。·但是单位为r的球壳面积更大,计算出的irradiance就更小。(此处itensity没有变,对于同一个方向而言,根据计算公式微分立体角不随球壳的大小改变。能量衰减相当于能量分散)

image-20230514135419108

radiance

​ 每单位垂直面积(所以dA要乘以cosθ)、每单位立体角(每个方向)上单位时间光辐射出的能量(所以做两次导数)/ 单位垂直面积,在单位时间内接收到某个方向的能量。也就是在irradiance的基础上增加的方向性。当直接辐射到平面上的程度越低时,光线就越弱,而当光线完全垂直于平面时强度最高。如果把单位立体角和单位面积看作无穷小,则可以计算单根光线到单个着色点的辐射率。

image-20230514141247249

​ 该方程也可以转换成如下两个方程:

image-20230514154139046

​ 在单位时间单位面积上会接收不同方向来的能量,或者会向不同方向散发能量,将E对立体角求导,得到具体某一个方向上的能量。在单位时间单位立体角上会接收一块面积光散发的能量,或者会向一块面积散发能量,将I对面积求导,得到具体单位面积散发/接收的能量。

image-20230514154149459

​ 在单位时间单位面积光会向各个方向辐射出能量,得到具体向某一个方向辐射出的能量。

image-20230514154158860

​ 对于一个单位面积,会接收到来自各个方向的能量,这里只考虑正半球,因为负半球来的光照射不到单位面积(Blinn-Phong模型中也会把cos最小值限制在0)。通过对各个方向的radiance积分求和,就可以得到对于一个单位面积的irradiance。如下式子的含义式,一个点(微分面积元,或者说着色点)所接收到的亮度(irradiance),由所有不同方向的入射光线亮度(radiance,可以从光源获得)共同贡献得到。

image-20230514145032647

​ 可以用如下离散的方式求积分函数的总面积/总体积。增加离散步长可以提高准确率。

1
2
3
4
5
6
7
8
9
10
11
int steps = 100;
float sum = 0.0f;
vec3 P = ...;
vec3 Wo = ...;
vec3 N = ...;
float dW = 1.0f / steps;
for(int i = 0; i < steps; ++i)
{
vec3 Wi = getNextIncomingLightDir(i);
sum += Fr(p, Wi, Wo) * L(p, Wi) * dot(N, Wi) * dW;
}

BRDF双向反射分布函数

​ 此处认为所谓反射,是指物体吸收了一部分能量(入射,接收光),再将一部分能量辐射出去(出射,反射光)。单位面积dA接收到 ωi 方向来的Radiance,下图中用 L(ωi) 表示,也能理解成iradicance的一个微元dE(ωi)= L(ωi)cosθidwi,然后再辐射到四面八方 ωr 中去,这时候辐射出去的又是Radiance(因为反射出去无数多条,power会被分散,此处关注其中的一个反射方向),用 dLr(x, ωr))表示。

image-20230514151942291

​ BRDF描述了入射光线经过某个表面反射后在各个可能的出射方向上能量分布。比如已经知道入射方向 ωi ,对于任意 ωr反射方向,能得到值域在[0,1]的浮点数返回值。返回值意义:定义某个点在 ωr 方向的反射光线的能量跟 ωi 方向射入的光线能量的比值。比如镜面反射,则镜面反射的方向能量接近百分之百,其他反射方向接近0比如漫反射,则所有方向的能量比例相同,均分;该函数描述了物体表面与光线如何作用,可以定义不同材质。Blinn-Phong光照模型也可以被认为是BRDF,但是没有考虑能量守恒。

image-20230514155905411
Cook-Torrance BRDF

Cook-Torrance BRDF兼有漫反射和镜面反射两个部分。kd是被折射的入射光能量比率,ks是被反射的比率。flambert 是漫反射部分(将以前漫反射的计算结果的点乘取出放入反射方程的cos),等于c/Π,c是表面颜色,除以Π是对反射光标准化(此处暂不考虑)。flambert 满足大多数实时渲染的目的。

镜面反射部分(分母部分用于归一化):

D:法线分布函数:估算在受到表面粗糙度的影响下,朝向方向与半程向量一致的微平面的数量。

这是用来估算微平面的主要函数。在给定0-1的粗糙程度下,计算与半程向量取向一致的微表面比例,返回0-1的比例值。在不同粗糙度参数下,当粗糙度很低(也就是说表面很光滑)的时候,与半程向量取向一致的微平面会高度集中在一个很小的半径范围内。由于这种集中性,NDF最终会生成一个非常明亮的斑点。但是当表面比较粗糙的时候,微平面的取向方向会更加的随机。与半程向量取向一致的微平面分布在一个大得多的半径范围内,但是同时较低的集中性也会让最终效果显得更加灰暗。

F:几何函数:描述了微平面自成阴影的属性。当一个平面相对比较粗糙的时候,平面表面上的微平面有可能挡住其他的微平面从而减少表面所反射的光线。几何函数从统计学上近似的求得了微平面间相互遮蔽的比率,这种相互遮蔽会损耗光线的能量。

几何函数还是需要将粗糙度作为输入参数,不过这里的粗糙度是D函数粗糙度的重新映射,取决于是直接光照还是IBL光照。也需要考虑光线向量和观察方向。1.0表示没有微表面阴影,0.0表示彻底被遮蔽。

G:菲涅尔方程:菲涅尔方程描述的是在不同的表面角下表面所反射的光线所占的比率。比例会随着观察角度的不同而不同。

每个表面或材料在直视其表面时都有一定程度的基础反射率,但从某个角度观察表面时,与表面的基础反射率相比,所有反射都变得更加明显。F0是基础反射率,使用折射率或者IOR计算。

Fresnel-Schlick近似仅仅对电介质或者说非金属表面有定义,使用一些处理和插值使得金属也可以使用该公式。对于导体或者金属表面而言基础反射率一般是带有色彩,所以F0会用RGB表示。这些金属表面相比于电介质表面所独有的特性引出了所谓的金属工作流的概念。也就是需要额外使用一个被称为金属度(Metalness)的参数来参与编写表面材质。金属度用来描述一个材质表面是金属还是非金属的。如果是金属需要对F0着色(表面纹理,金属无漫反射)。

PBR渲染管线所需要的每一个表面参数都可以用纹理来定义或者建模。使用纹理可以逐个片段的来控制每个表面上特定的点对于光线是如何响应的。

反射方程

​ 即单位面积所接受的能量,是由所有不同方向上入射光线的irradiance贡献得到的,图中的L(wi方向来达到点x的光线),而不同方向入射光irradiance对反射方向ωr(点x向wr方向辐射的光线)的贡献程度由BRDF函数决定。将所有irradiance对反射方向的贡献积分,得到一个单位面积(一点)在整个光照环境下,对出射方向(观测方向)的贡献。

image-20230514155930809

​ 入射光线的radiance不仅仅是光源所造成,还有可能是其他物体上着色点的反射光线的radiance,恰好反射到当前的着色点p。所以一个物体的反射光会成为另一个物体的入射光,因此是一个递归的过程。

渲染方程

​ 此处所有方向认为朝外,从点p指向外。认为下半球的贡献为0。此处cos用法线和微分立体角(方向)的点积表示。

image-20230514160826844

​ 对于一个点光源,该点只会接收到来自点光源的一根光线:

image-20230514161236661

​ 对于多个点光源:

image-20230514161340411

​ 对于面光源,就相当于无穷多个点光源的集合,只需要对面光源所在的立体角范围进行积分:

image-20230514161626837

​ 如果场景中有加入其他物体,可以把其他物体同样考虑成面光源,对其所占的立体角进行积分。只不过对其它物体的立体角积分不像是面光源所有入射方向都有radiance,物体的立体角可能只有个别几个方向有入射的radiance(即多次物体间光线反射之后恰好照射到着色点x),其它方向没有,但本质上都可以视作是面光源。如下对于物体x’:

image-20230514162240837

​ 其中各项与原渲染方程中一一对应,(这里其实是有数学严格推导的,不过只是为了接下来构建直观的物理解释,对于这些推导不必在意,默认成立即可

image-20230514162954768

​ 进一步简写:

image-20230514163214255

​ E为物体自己发光,KE则代表对光源反射一次的结果,即直接光照,那么前两项之和就是光栅化当中着色所考虑的结果。对于全局光照来说,还考虑了一次弹射的间接照明、两次弹射的间接照明,依次类推。着色点的值就是物体自发光加上直接光照与多次间接光照的结果,而这一切都是从渲染方程推导而来的,因此这也正是渲染方程的物理意义。

image-20230514163328230

​ 如下是一个示例:

​ (1)一次反射直接光照(光栅化),能被光照亮的部分就是有颜色的,不能被光照亮的部分就是黑色:

image-20230514164109124

​ (2)两次反射,考虑到一次弹射的间接光照:

image-20230514164122323

​ (3)3次反射,考虑到两次弹射的间接光照:

image-20230514164142826

​ (4)4次反射,灯亮的原因:光经过两层玻璃折射进去,经过两层玻璃折射出来被照相机看到

image-20230514164254408

​ 考虑次数越多越接近真实图片效果,如果经过无限次数,由于能量守恒,最后趋近收敛。与快门时间越长接收越来越多光照 导致曝光是两回事。

基础概率论

​ X:随机变量(可以取某些值的一个数)。

​ X~p(x):随机变量的概率分布,描述随机过程选择值 x 的相对概率,必须包含所有能取到的值。

​ 概率分布对于离散型随机变量按照如下方式表示:

image-20230514181104266

​ 例如对于骰子:p(1)=p(2)=p(3)=p(4)=p(5)=p(6)=1/6。

​ 对于所有可能取值的概率,概率必须大于0,这些概率和相加为1:

image-20230514171530816

​ 期望:从随机分布中重复抽取样本所获得的平均值。

image-20230514171636464

​ X~p(x)在连续情况下,一个随机变量 X,可以取任意一组连续值,其概率分布由连续概率密度函数PDF 给出。通过对该函数积分得到一段区间内的面积,即为X在这段区间内的概率值。

image-20230514175327878

​ 随机变量X的函数Y,也是随机变量,随机变量函数的期望值计算如下:

image-20230514175300955
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.

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信