实时渲染中的PBR方程是这样的 但是很多教程中对这些项的含义解释的不够清楚, 我在学习中遇到许多困惑. 搜索资料后找到的答案, 这里分享给大家. 阅读前需要读者对PBR有简单的了解. 1. L的单位是什么?这其实是一个很重要的问题, 如果没有弄清楚单位, 整个PBR方程会令人非常困惑. 其实从 色度学单位和辐度学单位是一一对应的, 详细的分析和转换过程可以参考 https://zhuanlan.zhihu.com/p/118272193. 辐度学单位描述真实的物理辐射, 色度学单位描述人眼的感受. PBR方程使用两种单位系统都是可以的, 我们在这里使用辐度学单位. 需要注意的是辐亮度的定义为: 这里下面除的面积是一个投影面积. 为什么要使用辐亮度这个单位呢? 我想原因主要是这两点: (1) 符合光的传播特征, 光是发散式传播的, 辐亮度是一个不会随距离变化的量. (2) 符合人眼的观察特征, 固定辐亮度的物体, 在任何距离观察亮度总是相同的. 这点是符合我们生活常识的. 原因的话可以理解为距离变远后, 虽然到达人眼的辐通量变少了, 但是形成的像也变小了, 所以看到的亮度不变. 这里用数学方式再来验证下: 设距离 微元表面在瞳孔上形成的立体角为 所以 2. BRDF到底是啥?首先不考虑BRDF函数, 我们来计算下整个半球面上的辐照度 把整个辐照度看作是半球上的辐亮度积分,可得: 而在任意方向上出射的光的辐亮度微分和任意方向上入射光辐亮度微分成正比的: 这个比例就是关于 需要注意的是这两个微分的不同, BRDF函数乘以辐照度值, 得到的是辐亮度, 使单位发生了变化. 这样在整个半球面上积分,得到: BRDF满足: (1) 交换律: (2) 能量守恒: 3. 菲涅尔反射的含义是什么? 金属和电介质的菲涅尔项有什么不同?菲涅尔反射描述一个完全平坦的,由两个不同折射率介质组成的表面对光的反射率。 在不同折射率的介质相交表面,光会部分反射且部分折射,反射的比例就是菲涅尔系数。菲涅尔系数满足 菲涅尔系数是可以由麦克斯韦方程组直接推导出来的,形式也很复杂。 已知两种介质的折射率分别为 然后根据麦克斯韦方程组计算推导,平行和垂直偏振光的菲涅尔反射公式: 渲染中我们无需考虑偏振光的影响,得到: 不同材质的菲涅尔系数做成图示例如下: ![]() 可以看出在观察角度接近掠夺角(90度)的时候,菲涅尔系数都是趋近于1的,这种现象叫做菲涅尔现象。 接下来要分开讨论电介质和金属: A.电介质 可以看出,对于电介质来说,菲涅尔系数基本上不会随着波长变化。 我们现在用Schlick近似来表示菲涅尔系数: 将观察角为0时的菲涅尔系数记为 Schilick近似为: 常见电介质的 ![]() 可以看出电介质的 另外需要知道的是,我们这里的菲涅尔项是反射的比例,没有被反射的部分自然是形成折射。因为这里讨论的是不透明表面光,折射部分的光传入介质内部后,部分被吸收,部分再次出射形成漫反射/次表面散射。 ![]() B.金属 金属和电介质的区别主要体现在这两点: (1) 金属的折射率是复数, 金属的折射率表示为 这里菲涅尔公式仍然适用, 只是计算起来会复杂一点. 上面我们说电介质的菲涅尔表示反射比例, 剩余的部分是折射. 对于金属来说, 因为金属内部是可以自由运动的电子, 剩余的部分是直接被金属吸收了. 也就是说, 金属不会产生漫反射. (2) 金属的折射率随光波长变化剧烈, 因此在Schilick近似时, 我们要把 ![]() 从这个性质也可以知道, 电介质的颜色是来自于漫反射, 而金属的颜色是来自于菲涅尔反射/镜面反射. 4. BRDF如何表示全镜面反射?对于一个全镜面反射来说, 只需要考虑菲涅反射的系数, 也就是说 这里 现在的问题是, 我们如何描述这里的 这样, 将狄拉克函数带入到方程中, 得到: 得到BRDF的表示为: 5. 如何理解漫反射?前面我们已经讲过漫反射形成的原因, 就是没有被菲涅尔反射的部分, 再次出射形成的. 我们通常使用Labertian模型来描述漫反射, 这种模型假定在所有方向观察物体表面的亮度完全相同. Lambertian模型下的BRDF函数表示为 现在来解释下为什么这里要除以 在Lambertian漫反射模型下 , 由能量守恒可知 因为Lambertian漫反射假设在所有方向观察亮度都是相同的, 因此漫反射的BRDF 我们前面说过, BRDF的作用之一是将辐照度值 在现实生活中的漫反射并不是完全符合Labertian漫反射模型的, Oren–Nayar漫反射模型等一些更加复杂的模型可以更好地表示现实中的漫反射. 但是在实际渲染中发现, 使用更加复杂的模型的提升很小. 出于性能考虑, 目前在实时渲染中Lambertian模型还是主流. 6. 如何理解微表面模型在镜面反射中的应用?微表面模型在BRDF中体现在法线分布项D和几何遮蔽项G.这里我们来分别分析下. 前面我们讲到菲涅尔反射的比例, 都是针对完全镜面反射, 即 在微表面模型中, 只有微元表面法线朝向 对于完全光滑的平面, 对于粗糙的平面, 我们使用参数 从物理合理的角度来说, 法线分布函数必须满足 ![]() 从BRDF单位转换的角度来说, D项是负责将辐照度值 几何分布函数有很多种近似模型, 常用的一个为Trowbridge-Reitz GGX: 既然微表面模型假设微表面是崎岖不平的, 自然会产生遮挡, 导致某些部分我们无法看到. 定义遮挡函数 对于一般的表面来说, 微表面可见的比例和法线 从物理合理的角度来说, 一块面积为 ![]() 因为光在入射到平面上时也会有遮挡, 所以可以得到几何衰减项为: 一个常用的几何衰减的近似为Schlick-GGX近似: 7. 镜面反射的BRDF如何推导?现在我们已经有了Torrance–Sparrow模型下镜面反射BRDF需要的DFG各项函数, 来推导下BRDF镜面反射的表示. 很多PBR教程这步都是直接给出一个结论, 没有具体的推导过程. 微表面模型中, 每个微表面都是产生完全镜面反射. 现在考虑从 ![]() 我们在这里定义 ![]() 先不考虑几何衰减项 现在来计算 这里的 带入后化简得: 再把几何衰减项带入得到完整的Torrance–Sparrow BRDF: 8. 实时渲染中整个渲染方程如何确定?现在就是确定整个的PBR方程.由前面的计算可以得到PBR方程为: 实时渲染的材质通常需要混合金属和电介质材质. 我们用 这样在计算镜面反射时为了方便地实现金属和电介质的混合, 我们取 菲涅尔项 对于漫反射项, 我们知道金属是不产生漫反射的. 所以先减去镜面反射的比例, 再乘以电介质的比例得 这样就得到整个渲染方程大致为: 一般我们在游戏引擎中使用时, 往往会把漫反射中的 9. PBR方程如何和光照联系?一般来说, 实时渲染的光源只有一个或者几个, 实时渲染中计算时肯定不能直接按照积分来求值, 我们这里来看下怎么将直接光源带入到方程当中. 通常我们使用的光源都是确定光源(punctual light), 确定光源的含义就是只有某个方向上有值. 确定光源包括点光源, 聚光和直线光. 对于点光源和聚光, 我们使用辐强度 但是在渲染方程中, 我们输入的光照单位是辐亮度 对于点光源来说, 设 带入到PBR方程得: 对于直线光源, 设直线光源的辐照度为 从另外一个角度来分析这个问题, 我们在前面提到过, BRDF输入一个辐照度 对于单个确定光源来说, 只有一个方向上有光照, 设这个方向为 对于点光源来说, 容易算得 上面我们提到的几何衰减Schlick-GGX近似公式为: 这里在计算直接光照时, 关于IBL光照部分, 可以参考我的另一篇文章https://zhuanlan.zhihu.com/p/162793239, 这里不再深入讨论. |
|手机版|小黑屋|九艺游戏动画论坛
( 津ICP备2022000452号-1 )
GMT+8, 2023-6-10 20:09 , Processed in 0.049145 second(s), 20 queries .
Powered by Discuz! X3.4 © 2001-2017 Comsenz Inc.