当前位置:   article > 正文

瑞利分布概率密度函数推导_IBL推导及实现

瑞利分布的概率密度函数

d4c6b554c2d253142a1be1e9a7aa3788.png

0. 前置说明

这篇文章是我实现IBL过程中初略数学推导笔记,如有错误在此先谢过聚聚们的指出。另外为了不影响阅读,部分用到的数学原理以及推导放在了附录。在此感谢U聚 @Ubp.a 和鸭聚 @膜力鸭苏蛙可 无私奉献。

1. Irradiance map

基于兰伯特的漫反射项可以表示为:

注意

因此写成

实际上是错误的,
项需要转换才能移出积分式,所以将
进行如下处理[4]:

最后式子变成了:

此时右边的积分表示的物理意义是单位立方体上任意一点为终点,从中心点出发的方向向量作为法向量

做一个半球的积分,光源来自于cubemap上的pixel,这样就得到了在各个方向上漫反射环境光。直接均匀采样
有:

也可以将

即余弦作为分布进行重要性采样 ,推导如下:

所以有

,即

使用蒙特卡洛方法后原方程变换如下:

Diffuse的CubeMap预积分图:

19e9a1a6081960058817657aa083afe3.png

2. specular处理

镜面项的反射方程可以表示为:

可以看到不同于漫反射只有法向量一个维度,如果直接使用蒙特卡洛积分运算量过大且需要实时更新,所以先将积分变换为:

根据附录推导可以知道:

根据法线分布函数的性质

,求得概率密度函数
有:

作为概率密度函数进行重要性采样:

为了继续化简,近似认为

并舍去
,这里解释可以参考 U聚的文章[1]

那么约去点乘式子变为:

根据附录的使用Smith shadowing-masking approximation可知:

那么有:

近似变换

后有:

可以看到

与粗糙度和
两个变量相关,且在给定粗糙度时有固定的k值:

近似到最后的式子中:

最后得到:

我们就可以预计算得到一张CubeMap直接使用。

2.1 prefilter environment map

prefilter enviroment map就是要计算出给定粗糙度的

。先根据粗糙度计算出mipmap,这里使用Krivanek的方法[5],在采样时对粗糙度进行处理加快收敛速度。

接着在Trowbridge-Reitz GGX上通过概率密度函数

采样
,根据前面推导有如下关系:

根据概率密度函数求边缘密度函数

所以得到:

分别为
的累计概率函数,有:

最后得出采样过后的

有:

预计算的

图片如下:

d84a6b8c5775605100a6d87ed4bd0666.png

2.2 BRDF LUT

搞定了

后式子只剩
,这个推导不少地方都有,这里只是再复述一遍。观察上式仅与
,
, 粗糙度有关,由于Trowbridge-Reitz GGX是各向同性的,所以有仅仅与
,粗糙度相关(与
无关 ),那么我们可以将式子转换为:

使用蒙特卡洛积分将

作为概率密度函数进行重要性采样:

用R通道与G通道存储scale与bias值,计算出来的就是对应BRDF的LUT。

76c17657f1b0f4b9e307be4f60dde1a4.png
LUT

最后附上代码地址与效果(图片中只有平行光的效果比较差):

1ae8037bf72b05a6218debd680975963.png
IBL​github.com

附录

1. 渲染方程与蒙特卡洛方法

1.1 渲染方程

只考虑各向同性的反射方程:

BRDF函数定义:在材质表面某一点上出射辐射度(Radiance)和入射辐照度(Irradiance)的比值,其关系如下

1.2 蒙特卡洛方法

[11]对于连续随机变量

,记它的函数为
,概率密度函数为
,那么我们有:

对于任意的

都有:

的累计概率函数,对于随机值
预估

2. Cook-Torrance模型

Cook-Torrance的BRDF函数定义如下:

若将

项提出,有:

因为Cook-Torrance模型的

项就是F函数(菲涅尔函数),即表示为下述形式:

注意一个误区是认为漫反射是许多微小表面不平的反射现象,但那是高中物理的解释。实际上在Cook-Torrance模型中微表面反射的情况已经被考虑到镜面反射中了,而漫反射考虑的是光线散射过程中的再次返回到入射表面的透射部分。如下图中的蓝色部分:

14ac4578f197cc9038ad94005fc59b3c.png

2.1 漫反射项

兰伯特双向反射分布函数是常数,albedo是贴图提供的基础反射率,其中
是为了保证能量守恒。考虑只有漫反射的情况,推导如下:

所以将aldebo 除 PI,将[0,1]映射到

,保证了能量守恒。

2.2 镜面反射项

关于下面常数的粗略推导如下: 假设为完全镜面反射,即所有能量都经过镜面反射,有

根据能量守恒我们有:

在单位球上,

在同一方向,所以有

综合上式可以得到:

代入到积分项中:

所以得到:

2.2.1 菲涅尔项-F

F是描述反射和透射与入射角的关系,一般只需要描述反射的部分。Schlick's approximation模型如下:

因为我们只考虑出射角度在

方向的光,所以只需要考虑表面法线为
的情况,即:

另外在游戏中为了统一金属与非金属材质,会对

进行金属度插值:

将非金属的系数设置为

,而在Unreal中给出的材质会多一张SpecularTexture用来控制该系数。

最后我使用的是UE的加速版本:

2.2.2 法线分布函数-D

D是描述微表面的法线分布关系的函数,但需要注意其并不是一个概率密度函数,定义如下:

上式可以理解为面上每个法线h被投影到法线为n的平面,总面积记为1。且对上式最后的宏观表面投影在垂直视线方向的平面上:

0d6c797e95f1cd5c9f64e1ae4ecd6d9a.png
图片来源RTR4

得到如下关系:

这里使用UE的版本-Trowbridge-Reitz GGX:

2.2.3 几何函数

G是描述微表面的几何遮蔽与几何阴影的关系,物理意义是光线被表面遮挡后所剩下的量。所以值范围在0-1。使用Smith shadowing-masking approximation假设入射遮挡与出射遮挡是不相关的,所以有:

Unreal使用的Schlick GGX近似模型表示为表示为:

对于IBL,

对于解析光源将粗糙度重新映射到

所以有:

参考全局光照技术,近年来引擎已经考虑入射遮挡和出射遮挡的相关性:

其中有:

这也是寒霜的材质做法[10]。

3. Equirectangular Map To CubeMap

将Equirectangular Map转CubeMap,也就是UV映射到球面的

。(我的转换空间up轴为
,其中记与z轴夹角为
,与y轴夹角为

因为我相机的front方向为

映射关系如下:

采样出来得到的CubeMap:

ae89658782e45029ca02fe8d87364843.png

因为在输出PNG时将值clamp到了

,所以会有亮度丢失。

参考

  1. Ubp.a:深入理解 PBR/基于图像照明 (IBL)
  2. 引擎搭建记录(1) - 基于物理的渲染(PBR)
  3. https://learnopengl.com/PBR/IBL
  4. https://seblagarde.wordpress.com/2011/08/17/hello-world/
  5. https://dcgi.fel.cvut.cz/publications/2008/krivanek-cgf-rts
  6. How Is The NDF Really Defined?
  7. 毛星云:【基于物理的渲染(PBR)白皮书】(四)法线分布函数相关总结
  8. http://www.cs.virginia.edu/~jdl/bib/appearance/analytic%20models/schlick94b.pdf
  9. https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf
  10. https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
  11. http://www.pbr-book.org/3ed-2018/Monte_Carlo_Integration/Metropolis_Sampling.html
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/83757
推荐阅读
相关标签
  

闽ICP备14008679号