# 虚幻4渲染编程(重写渲染管线篇)【第二卷:从零开始推导PBR渲染模型---下 上篇推导了一些通用公式。本来打算在第一卷就全部写完的,结果知乎有字数限制?我写超出字数限制的部分全部被删掉了!被删掉了!被删掉了!于是只好开个尾巴。下面就将使用之前的理论的公式推导一些特殊的光照模型 上篇链接: [小IVan:虚幻4渲染编程(重写渲染管线篇)【第一卷:从零开始推导PBR渲染模型---上】](https://zhuanlan.zhihu.com/p/46618943) 【布料】 我之前有做过一些布料的效果 [小IVan:虚幻4渲染编程(材质进阶篇)【第一卷:影视剧各种衣料--上】](https://zhuanlan.zhihu.com/p/44511051) 这里我们将一起来推导它的BRDF。由线性理论,我们可以把BRDF的漫反射项和镜面高光项拆开来。 漫反射项: 我们的布料模型仍然依赖于能量守恒的Lambertian漫射BRDF。并提供可选的次表面散射项。 这个额外的分量不是基于物理 的,可用于模拟某些类型织物中光的散射,部分吸收和再发射  ....................................................(1) 其中  是镜面反射中的菲涅尔项,在实践中,可以将   省去。 使用包裹漫射照明技术以其能量保守形式实现次表面散射:  .......(2) 其中   ,一般情况下固定   ,漫反射分量不能乘以 。 镜面反射: 我们使用的布镜面BRDF是Ashikhmin和Premoze描述的改进的微平面 BRDF。 在他们的论文中,Ashikhmin和Premoze指出,分布项是对BRDF有影响的,并且阴 影/掩蔽分量对于他们的天鹅绒分布来说不是必需的。 分布项本身是反向高斯分布。 这有助于实 现模糊照明(向前和向后散射),同时添加偏移以模拟前向镜面反射影响。 所谓的天鹅绒NDF定 义如下:  ....................................(3) 而Neubelt和Pettineo提出了这个NDF的标准化版本:  ........................(4) 所以完整的镜面BRDF使用更平滑的变体替换传统cook的分母可得  ...................................(5) 经过优化以适合半浮点格式并避免计算昂贵的余切,而 是依赖于三角恒等式,可以得到如下代码: ![img](UnrealCustomPipeLine_02.assets/Thu, 08 Aug 2019 132913.jpeg) Estevez和Kulla提出了一种基于指数正弦而不是倒置高斯的不同NDF(称 为“查理”光泽)。 这个NDF很有吸引力:它的参数化感觉更加自然和直观,它提供了更柔和的外 观,如公式 所示,它的实现更简单:  ....................................................(6) ![img](UnrealCustomPipeLine_02.assets/Thu, 08 Aug 2019 132919.jpeg) 【Clear Coat---车漆】 多层材质在世界上其实非常普遍车油漆,汽水罐, 漆木,丙烯酸等都可以用这种材质模型来描述。 ![img](UnrealCustomPipeLine_02.assets/Thu, 08 Aug 2019 132924.jpeg) 由于入射光将穿过透明涂层,我们还必须考虑能量损失。 然而,我们的模型不 会模拟相互反射和折射行为。 透明涂层将使用标准模型中使用的相同Cook-Torrance microfacet BRDF进行建模。 由于透明涂 层总是各向同性和电介质,粗糙度值较低,我们可以选择更便宜的DFG分 量而不会明显牺牲视觉质量。  ............................................(7) ![img](UnrealCustomPipeLine_02.assets/Thu, 08 Aug 2019 132929.jpeg) 为我们必须考虑到添加透明涂层引起的能量损失,我们可以重新表征BRDF:  .................(8) 其中   是透明图层的菲尼尔分量。   是透明图层的BRDF。镜面反射分量乘以  是为 了保持能量守恒,因为光进入并离开透明涂层。 乘以   的漫反射分量是对能量守恒的尝试。 ![img](UnrealCustomPipeLine_02.assets/Thu, 08 Aug 2019 132934.jpeg) 透明涂层的存在意味着我们应该重新计算 ,因为它通常基于空气-材质界面。 因此,基础层需 要基于透明涂层材质界面来计算 。 这可以通过从 计算材质的折射率(IOR),然后根据新计算的IOR和透明涂层的IOR(1.5)计 算新的 来实现。 首先,我们计算基础层的IOR: ![img](UnrealCustomPipeLine_02.assets/Thu, 08 Aug 2019 132940.jpeg) 然后我们从这个新的折射率计算新的 : ![img](UnrealCustomPipeLine_02.assets/Thu, 08 Aug 2019 132944.jpeg) 由于透明涂层的IOR是固定的,我们可以结合这两个步骤来简化: ![img](UnrealCustomPipeLine_02.assets/Thu, 08 Aug 2019 132948.jpeg) 【双面次表面散射】 这种模型适合于树叶这种类型的物体 ![img](UnrealCustomPipeLine_02.assets/Thu, 08 Aug 2019 132952.jpeg) ![img](UnrealCustomPipeLine_02.assets/Thu, 08 Aug 2019 132956.jpeg) 什么?动画,打光,氛围?去做个小短片放松一下 Enjoy It! 参考资料