games202:五,基于物理的材质:Microfacet、Kulla-Conty估计、LTC、NPR

  • 一,微表面模型Microfacet BRDF
    • 1.1NDF
      • 1.1.1 Beckmann分布
      • 1.1.2 GGX分布
    • 1.2 G几何修正项
    • 1.3 能量补偿项
      • 1.3.1 Kulla-Conty估计方法
      • 特别提醒
    • 1.4 线性变换余弦(LTC-Linearly Transformed Cosines)
  • 二,迪士尼Disney Principled BRDF
  • 三,NPR - Non-photorealistic rendering
    • 3.1 描边Outline
    • 3.2 色块
    • 3.3 素描Strokes Surface Stylization
  • 参考资料

今天讲我们熟悉的PBR啦,PBR实际包含材质、光照、相机(透镜成像)、光线传播等等,一般说起来就是指材质。

  • 在RTR中的PBR:

    1. 对表面:大部分是用微表面模型和迪士尼原则的BRDF(艺术家友好但不是PBR)。
    2. 对体积:多数关注快速近似计算单独或多重的散射。(头发TressFX、皮肤、云等)
    3. RTR中基本都不是PBR,使用各种小技巧来模拟离线渲染,性能才是第一位

一,微表面模型Microfacet BRDF

复习下微表面理论:微平面理论复习

f c o o k − t o r r a n c e = F ( i , h ) G ( i , o , h ) D ( h ) 4 ( n , i ) ( n , o ) f_{cook-torrance}= \frac {F(i,h)G(i,o,h)D(h)}{4(n,i)(n,o)} fcook−torrance​=4(n,i)(n,o)F(i,h)G(i,o,h)D(h)​

  1. F为菲涅尔方程(Fresnel Rquation),考虑不同入射角下反射光所占比例的区别(角度越大,反射越多)----[0.1]
  2. G为几何函数(Geometry Function)(也叫Masking-Shadowing项),描述微表面之间的自遮挡(光线入射角大时更容易遮挡)----[0.1]
  3. D为法线分布函数(Normal Distribution Function–NDF),有Beckmann、GGX、严老师模型等分布模型「法线分布函数复习」

1.1NDF

1.1.1 Beckmann分布

D b ( h ) = e x p − t a n 2 θ h α 2 π α 2 c o s 4 θ h D_{b}(h) = \frac{exp^{- \frac{tan^2θ_h}{α^2}}}{πα^2cos^4θ_h} Db​(h)=πα2cos4θh​exp−α2tan2θh​​​
(类高斯分布),其中θ为n、h的夹角,这里用tanθ而不是用θ是因为BeckmannNDF被定义在坡度空间上,见下图,即把高斯函数定义在一个平面上,又因为高斯函数的远处无线小但大于0,在平面最远处可以定义一个极限90度的tan数值,这样可以保证不可能出现大于90而朝下的微表面。

1.1.2 GGX分布

比Beckmann有更好的Long tail高光长尾(衰减更加柔和)

1.2 G几何修正项

又名Shadowing Masking项。

  • 自遮挡可以分为两种情况:挡住入射光线,被称为阴影(Shadowing);挡住出射光线,被称为遮蔽(Masking)。G就是提供这个使表面“变暗”的操作。
  • 另外,公式中除G项外的结果,在物体边缘掠射角度处会变得异常亮,而G项可以修正这一点
  • 常用的是Smith几何项

1.3 能量补偿项

在G项计算中,由于没有考虑到多次弹射中的能量损失,所以当粗糙度大时能量不守恒(粗糙度大整体变暗),而且越粗糙能量损失越多。

工业界为了解决这个问题会对模型增加一个能量补偿项,通过创建一个额外的BRDF波瓣来近似估计丢失的能量。(当光线不被遮挡的时候会直接被看到;而当反射光线被微表面遮挡的时候,认为这些被挡住的光线经过后续弹射,直到被看到)

1.3.1 Kulla-Conty估计方法

(通过经验方式补全丢失的能量)

  • 假设L为1,那么一次反射后的出射能量为 E ( μ o ) = ∫ 0 2 π ∫ 0 1 f ( μ o , μ i , φ ) μ i d μ i d φ − > ( μ i = s i n θ ) E(μ_o) = \int_{0}^{2π} \int_{0}^{1} f(μ_o,μ_i,φ)μ_idμ_idφ-> (μ_i=sinθ) E(μo​)=∫02π​∫01​f(μo​,μi​,φ)μi​dμi​dφ−>(μi​=sinθ),那么光线丢失的能量就是 1 − E ( μ o ) 1-E(μ_o) 1−E(μo​)。
  • 再考虑到BRDF的可逆性,入射出射方向的丢失都要考虑,因此这里的BRDF设计为 c ( 1 − E ( μ o ) ) ( 1 − E ( μ i ) ) c(1-E(μ_o))(1-E(μ_i)) c(1−E(μo​))(1−E(μi​)),要求将这个BRDF积分后,要等于恰好等于丢失的能量。
  • 这里的c可以计算出来 c = 1 π ( 1 − E a v g ) c = \frac {1}{π(1-E_{avg})} c=π(1−Eavg​)1​, E a v g E_{avg} Eavg​是半球上E的余弦加权平均值, E a v g = 2 ∫ 0 1 E μ μ d μ E_{avg} = 2 \int_{0}^{1}E_{μ}μdμ Eavg​=2∫01​Eμ​μdμ
  • 推导过程如下(贴大佬):

  • 但 E a v g E_{avg} Eavg​还是不知道且很复杂,对于这种复杂又不知道有无解析解的积分,我们可以:预计算、打表,由于这里的积分只与粗糙度和μ有关,我们可以得到预计算图(而且由于过度平缓,32*32分辨率就行)

    这样做后结果明显好转:

    但此时依然有问题,因为如果BRDF是有颜色的,则能量会吸收,能量积分和不为1了。Kulla-Conty方法是先考虑没有颜色的情况,再考虑由颜色引起的能量损失(从菲涅尔项入手–菲涅尔就体现了不同波长的反射率)。

  • 这里定义了“平均菲涅尔项”(不考虑观察方向的情况下) F a v g = ∫ 0 1 F ( μ ) μ d μ ∫ 0 1 μ d μ = 2 ∫ 0 1 F ( μ ) μ d μ F_{avg} = \frac{\int_0^1 F(μ)μdμ}{\int_0^1μdμ} = 2\int_0^1 F(μ)μdμ Favg​=∫01​μdμ∫01​F(μ)μdμ​=2∫01​F(μ)μdμ

  • 在有颜色时,第一次反射有 F a v g E a v g F_{avg}E_{avg} Favg​Eavg​的能量被反射,第二次有 F a v g ( 1 − E a v g ) F a v g E a v g F_{avg}(1-E_{avg})F_{avg}E_{avg} Favg​(1−Eavg​)Favg​Eavg​的能量被反射,可以得到累加颜色项 F a v g E a v g 1 − F a v g ( 1 − E a v g ) \frac{F_{avg}E_{avg}}{1-F_{avg}(1-E_{avg})} 1−Favg​(1−Eavg​)Favg​Eavg​​与不带颜色的结果相乘,即可补足颜色的能量损失。

特别提醒

有的人或引擎(点名learnopengl)在微表面BRDF后加上一个diffuse,这样做完全错且没有意义且完全错误,物理不正确且不守恒,会搞出来会发光的物体…………(还好我直射光没加,但计算环境光还是加了,是参考opengl的),老师没教过这种做法,这么写了出门别说是他学生……

1.4 线性变换余弦(LTC-Linearly Transformed Cosines)

LTC是为了解决微表面模型下 「多边形光源采样问题」 的一种专门的着色方法(用GGX-NDF且无阴影)。

任意BRDF的任意光源下的渲染方程积分不好计算,该方法将2d的BRDF线性变换为截断余弦分布,将问题转换为固定余弦下对任意多边形光源积分的问题(有解析解),从而大大的提升了面光源积分的计算效率。

  • 核心方法:

对任意观察方向预计算一个变化矩阵M,将标准空间的BRDF转化到余弦空间,这个过程中所有输入w的方向、积分域都相应改变(相当于用一个余弦空间lobe去拟合标准lobe,整个面光源都被变换)。

  • 具体计算:

在面光源中假设光源 L i L_i Li​是uniform的,因此渲染方程变为 L ( ω o ) = L i ⋅ ∫ P F ( ω i ) d ω i L(ω_o) = L_i \cdot \int_P F(ω_i)dω_i L(ωo​)=Li​⋅∫P​F(ωi​)dωi​,带入 ω i = M ω i ′ ∥ M ω i ′ ∥ ω_i = \frac{Mω_i'}{\Vert Mω_i'\Vert} ωi​=∥Mωi′​∥Mωi′​​及余弦变换,得到
L ( ω o ) = L i ⋅ ∫ P c o s ( ω i ′ ) d M ω i ′ ∥ M ω i ′ ∥ = L i ⋅ ∫ P c o s ( ω i ′ ) J d ω i ′ L(ω_o) = L_i \cdot \int_P cos(ω_i')d\frac{Mω_i'}{\Vert Mω_i'\Vert} = L_i \cdot \int_P cos(ω_i')Jdω_i' L(ωo​)=Li​⋅∫P​cos(ωi′​)d∥Mωi′​∥Mωi′​​=Li​⋅∫P​cos(ωi′​)Jdωi′​
这里的J是Jacobi项,雅克比行列式,是换元后产生的系数(二重积分常用)。

上边换元的公式是有解析解的,可以解出BRDF。那具体是怎么转换到余弦空间呢?论文做了一个转换矩阵的预计算,更详细的内容可以看原论文Linear-Light Shading with Linearly Transformed Cosines-2019,或者知乎牛人的论文复现

  • tip:
  1. 由于LTC不考虑阴影,因此如果有物体挡住了这个面光源,就吃不消了
  2. 这工作是unity research的Eric Heitz大佬做的,得到业内广泛认可
  3. 各向异性的表面也能用LTC,因为不同方位角总能找到合适的变换矩阵,使拟合误差最小
  4. LTC就是一种将 变化BRDF 和 变化光源 的 shading问题,转化为 固定BRDF 和 变化光源 问题的一种解决方案

二,迪士尼Disney Principled BRDF

微表面模型虽然很好但也存在一些问题:

  1. 不擅长表现真实材质(比如不加能量补偿项时的能量缺失),如清漆(clear coat)这种多层材质的表现
  2. 艺术家不友好,实际使用人–艺术家并不在乎物理准不准确

迪士尼原则的BRDF就是对艺术家友好的一种模型(虽然物理不正确但也被叫做PBR),他的参数更简单易懂直观好操控,分为了10个参数见图:

  • 挑几个说下:

subsurface(次表面):比diffuse更平的效果
specularTint(镜面反射颜色):镜面反射的颜色(让步美术),0表示无色,1表示材质固有色,但边缘镜面反射都为无色
sheen(光泽度):一种额外的绒毛掠射分量,主要用于天鹅绒等布料
sheenTint(光泽颜色):控制sheen的颜色,0表示无色,1表示材质固有色
clearcoat(清漆强度):第二个镜面波瓣,控制透明涂层的明显程度
clearcoatGloss(清漆光泽度):控制透明涂层的光泽度,0表示磨砂,1表示光滑

  • tips:
  1. 参数越多越冗余、重复
  2. 虽然迪士尼BRDF不完全符合物理,但他模拟的就是能量守恒模型,如果不考虑误差也可以说是能量守恒的(学术界后期处理模拟、近似也很多,不用那么死板)
  3. 迪士尼BRDF不太适合实时渲染,如果用Disney那一整套算法都得改

三,NPR - Non-photorealistic rendering

NPR=(fast and reliable可靠的)stylization风格化(通过一些轻量级的处理)。一般思路是先绘制真实风格,再从中抽象、强调重要的部分,得到风格化的结果。

  • 一些背景:学术界对 NPR 的研究不太活跃,相关的会议 NPAR 在 2017 年之后没有再举办

3.1 描边Outline

not just contours(外边缘),包含Boundary edge(面的边缘)、Crease(折痕)、Material edge(不同材质边缘)、Silhouette edge(由多个面共享的外边缘)

  • 1,shading 描边
    可以使模型法线与视线方向越垂直的地方颜色越暗,再使用阈值、step等方式取用----但这样效果可能粗细不一致(左图)

  • 2,Geometry 描边
    也可以通过几何方法(类似把模型放大一圈,放在原模型背后),只扩大模型背对视角的面使背面模型大一圈,并用黑色渲染,然后再渲染正面(右图)。这个思路有很多优化方法,如扩大边、沿法线扩大、扩大后平滑角等。
  • 3,Image 描边
    图像后处理,如sobel算子等方式进行边缘检测(英雄联盟用);除了在图像上处理,还可以在法线、深度图等删改进行处理。

3.2 色块

阈值化颜色,可以在shading过程中进行,也可以后处理时再阈值化。还可以进行更细化的操作如量化(Quantization)颜色。也可以diffuse、specular分开阈值化等等,操作很多。

3.3 素描Strokes Surface Stylization

什么是素描效果?—描边的同时,暗的地方有美术笔触

  • Tomal art maps(TAMs)方法:

    1. 设计不同笔触的纹理,并为每个纹理制作mipmap(注意这里缩小的同时没有更密集)
    2. 搜索适配—根据着色点的明暗及位置
  • tips:

    1. npr是美术驱动的,实现是最简单的,是在翻译艺术家的想法
    2. npr本质就在做if else,对不同风格、设计、材质甚至部位都要有不同的实现
    3. npr做的好不好很大程度取决于其背后的“photorealistic真实风格”做的好不好,先真实才好抽象

参考资料

1,GAMES202高质量实时渲染-个人笔记:基于物理的实时渲染-风烟流年
2,《GAMES202:高质量实时渲染》4 实时高质量着色-zhiwei

games202:五,基于物理的材质:Microfacet、Kulla-Conty估计、LTC、NPR相关推荐

  1. PBR——概述、基于物理的材质

    PBR概述 PBR,即Physically Based Rendering,主要分为基于物理的材质.基于物理的光照和基于物理的相机三个部分,目前来说对大家最为所熟知的是基于物理的材质部分.本文围绕基于 ...

  2. 基于物理着色原理讲解之一

    基于物理着色(Physically Based Shading)就是计算机图形学中用数学建模的方式模拟物体表面各种材质散射光线的属性从而渲染照片真实图片的技术.基于物理的材质模型现在已经广泛的被各种渲 ...

  3. 基于物理的渲染—迪士尼的渲染模型

    原文链接:https://blog.uwa4d.com/archives/Study_Shading-Disney.html 今天给大家介绍的是一篇关于基于物理渲染(Physically Based ...

  4. 基于物理渲染的基础理论

    本篇作为理论的概括介绍,并不涉及公式的部分 基于物理渲染的优点 很容易就可以作出真实和照片级的效果. 同一配置可以适用于在不同HDR光照环境下. 接口简单而直观,都是基于世界真实的参数.(如粗糙度,金 ...

  5. PBR 基于物理的渲染

    1. PBR一般概念 1. 什么是PBR PBR(Physicallly-Based-Rendering), 基于物理的渲染,有时也叫PBS(Physicallly-Based-Shading),(其 ...

  6. 基于物理相机渲染 第一篇 EV light condition(相机曝光值与光照情况关系)

    第一节 基于物理相机曝光方案 一套完善的基于物理渲染的系统要有三部分组成:(1)基于物理的材质(Physically material):(2)基于物理的光照(Physically based lig ...

  7. 基于物理着色(二)- Microfacet材质和多层材质

    基于物理着色(二)- Microfacet材质和多层材质 文刀秋二 · 3 个月前 上一篇文章介绍了基于物理着色的基本概念以及最基本的漫反射与镜面反射模型,这一篇会介绍利用Microfacet模型对粗 ...

  8. 【基于物理的渲染(PBR)白皮书】(五)几何函数相关总结

            本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处           文章链接: https://zhuanlan.zhihu.com/p/81708753 在基于物理的渲染 ...

  9. [图形学] 基于物理的渲染(PBR)

    reference :<real-time rendering 4> BRDF 概述 基于物理的渲染即计算沿着视线进入相机的光照辐射.如果不考虑吸收或散射的介质,则进入相机的辐射等于离开相 ...

最新文章

  1. Android--制作开场动画/MediaPlayer OnCompletionListener
  2. 汇编语言之数据处理的2个基本问题
  3. P2717-寒假作业【逆序对,树状数组】
  4. 昆仑通态复制的程序可以用吗_三菱FX2n plc(编程口)与昆仑通态(MCGS)无线通讯案例...
  5. cuda支持 java_cuda运行时错误(48):没有内核映像可用于在设备上执行
  6. python module: csv
  7. 一步一步在virtual box4.1.6中安装基于rhel5.5x86_64的oracle 10g R2双节点RAC
  8. stata15中文乱码_Stata转excel中文乱码解决方法
  9. 卡诺模型案例分析_客户满意之卡诺模型
  10. 百练_3709:2进制转化为3进制
  11. ultracompare中文乱码解决方法
  12. matlab中opc没有注册类,电脑中出现没有注册类别的错误提示的多种解决方法
  13. 传统 以太网 时隙(slot time) 理解
  14. RPL(10):RFC6550翻译(10)---分组转发和环路避免/检测
  15. Dubbox框架使用手册
  16. Tomcat报错系统找不到指定的路径
  17. postgresql源码学习(53)—— vacuum②-lazy vacuum之heap_vacuum_rel函数
  18. iOS常用快捷键/终端常用指令
  19. freebsd 网桥设置
  20. 【预告】千亿数据的潘多拉魔盒:从分库分表到分布式数据库

热门文章

  1. Exadata 机器介绍
  2. unity图片水平/垂直翻转
  3. java框架 token_Java安全框架(三):JWT(Json Web Token)
  4. x ,1/x的关系; 反函数的实质:xy可以互换,就是进行坐标轴变化,就是关于y=x对称 反函数性质:f-1(f(x))=x; 反三角函数‘
  5. 教程 | “美好体验”本地 BLAST 基因功能鉴定
  6. drawlayble
  7. GNSS位移监测站系统,RTK技术应用案例
  8. 【教程】制作能在ARM板上直接运行的gcc本地编译器
  9. 《系统之美》读书之感
  10. C++将二进制图片数据转换为JPG格式