LearnOpenGL 学习笔记 PBR

本文详细介绍了基于物理的渲染(PBR)中的光照基础知识,包括辐射度量学、渲染方程和微表面模型。重点讲解了环境光照的两种形式——漫反射立方体环境贴图和镜面反射的卷积计算,涉及到预滤波环境贴图、BRDF积分贴图的生成,以及蒙特卡罗积分和重要性采样的应用。此外,还讨论了预过滤卷积中的伪像和高粗糙度立方体贴图的接缝问题。

PBR 基础知识

辐射度量学,渲染方程,PBR 基于物理的渲染:微表面、能量守恒、反射方程中的双向反射分布函数 BRDF、漫反射部分和镜面反射部分

光照

IBL

光源不是如前一节教程中描述的可分解的直接光源,而是将周围环境整体视为一个大光源。

IBL 通常使用(取自现实世界或从3D场景生成的)环境立方体贴图 (Cubemap) ,我们可以将立方体贴图的每个像素视为光源,在渲染方程中直接使用它。这种方式可以有效地捕捉环境的全局光照和氛围,使物体更好地融入其环境。

由于基于图像的光照算法会捕捉部分甚至全部的环境光照,通常认为它是一种更精确的环境光照输入格式,甚至也可以说是一种全局光照的粗略近似。基于此特性,IBL 对 PBR 很有意义,因为当我们将环境光纳入计算之后,物体在物理方面看起来会更加准确。

微表面模型下的反射方程

L o ( p , w o ) = ∫ Ω ( k d c π + k s D F G 4 ( w o ⋅ n ) ( w i ⋅ n ) ) L i ( p , w i ) n ⋅ w i d w i L_o(p,w_o) = \int_{\Omega}(k_d\dfrac{c}{\pi}+k_s\dfrac{DFG}{4(w_o\cdot n)(w_i\cdot n)})L_i(p,w_i) n \cdot w_i \mathrm d w_i Lo(p,wo)=Ω(kdπc+ks4(won)(win)DFG)Li(p,wi)nwidwi

假设只有一两个点光源,那么积分的计算就是离散的几个计算

但是如果是从各个方向都有光源的话,就需要对各个方向采样了

从各个方向采样的结果就是全局光照

也就是对于一个半球,采样 N 个点,每个点都发出 M 个光线,光线会返回 radiance

当然这很容易光线数量爆炸,所以 M = 1 是最保险的,称为路径追踪

M != 1 称为分布式路径追踪

光线使用俄罗斯轮盘赌来决定是否停止

更进一步,直接光照直接对光源方向进行蒙特卡洛积分,而间接光照就在半球上随机方向进行蒙特卡罗积分

当然每一个像素点做一遍路径追踪也很耗时,所以不是实时的

现在我们需要实时的算法。

对于反射方程的漫反射部分:

k d c π ∫ Ω L i ( p , w i ) n ⋅ w i d w i k_d\dfrac{c}{\pi} \int_{\Omega}L_i(p,w_i) n \cdot w_i \mathrm d w_i kdπcΩLi(p,wi)nwidwi

可以把这个积分做成一个立方体贴图,它在每个采样方向——也就是纹素——中存储漫反射积分的结果,这些结果是通过卷积计算出来的。

卷积的特性是,对数据集中的一个条目做一些计算时,要考虑到数据集中的所有其他条目。这里的数据集就是场景的辐射度或环境贴图。因此,要对立方体贴图中的每个采样方向做计算,我们都会考虑半球 Ω 上的所有其他采样方向。

为了对环境贴图进行卷积,我们通过对半球 Ω 上的大量方向进行离散采样并对其辐射度取平均值,来计算每个输出采样方向 wo 的积分。用来采样方向 wi 的半球,要面向卷积的输出采样方向 wo 。

这里的 p 都认为在立方体的中心

这个预计算的立方体贴图,在每个采样方向 wo 上存储其积分结果,可以理解为场景中所有能够击中面向 wo 的表面的间接漫反射光的预计算总和。这样的立方体贴图被称为辐照度图,因为经过卷积计算的立方体贴图能让我们从任何方向有效地直接采样场景(预计算好的)辐照度。

辐射方程也依赖了位置 p,不过这里我们假设它位于辐照度图的中心。这就意味着所有漫反射间接光只能来自同一个环境贴图,这样可能会破坏现实感(特别是在室内)。渲染引擎通过在场景中放置多个反射探针来解决此问题,每个反射探针单独预计算其周围环境的辐照度图。这样,位置 p 处的辐照度(以及辐射度)是取离其最近的反射探针之间的辐照度(辐射度)内插值。目前,我们假设总是从中心采样环境贴图,把反射探针的讨论留给后面的教程。

HDR

既然现在是用贴图来存一个计算结果,而且是基于物理的计算结果,那么这个计算结果就有可能大于 1

所以用传统的 0 到 1 的贴图来存是不行的,所以要用一个能够存大于 1 的文件格式,也就是 HDR

辐射度文件的格式(扩展名为 .hdr)存储了一张完整的立方体贴图,所有六个面数据都是浮点数,允许指定 0.0 到 1.0 范围之外的颜色值,以使光线具有正确的颜色强度。这个文件格式使用了一个聪明的技巧来存储每个浮点值:它并非直接存储每个通道的 32 位数据,而是每个通道存储 8 位,再以 alpha 通道存放指数——虽然确实会导致精度损失,但是非常有效率,不过需要解析程序将每种颜色重新转换为它们的浮点数等效值。

球状的贴图:

水平视角附近分辨率较高,而底部和顶部方向分辨率较低,在大多数情况下,这是一个不错的折衷方案,因为对于几乎所有渲染器来说,大部分有意义的光照和环境信息都在水平视角附近方向。

从等距柱状投影到立方体贴图

球到平面投影称为等距柱状投影

对等距柱状投影采样贵于对立方体贴图采样

所以先把等距柱状投影投影到立方体贴图

具体来说,就是把 hdr 作为 sampler2d

以标准化之后的视线方向的 xy 作为 hdr 贴图的 uv,去采样 hdr

得到的颜色就是要渲染到立方体贴图上的

渲染 6 次,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值