PBR

Physically-Based Rendering (PBR) and PBR Materials in RTR

PBR

PBR就是基于物理的渲染,PBR Materials也就是基于物理渲染的材质
PBR不止材质 但一般指的主要是材质
实时用的材质种类和质量和准确度不如离线

For surfaces 基于表面定义的材质

基于物理的渲染遵守微平面理论 Microfacet BRDF
Disney Principled BRDF 由于计算量小,能表现的材质总量多,也用于实时渲染,而迪士尼的brdfs也不完全基于物理,更多是为艺术家服务

Microfacet BRDF

微表面的法线分布函数 法线分布的不同导致渲染的结果也不同
Cook-Torrance BRDF
microfacetbrdf

  • The Fresnel Term (F项)
    根据入射角不同有多少能量被反射 入射角度越接近掠射角度反射的量越多
    将两种极化的光线加起来除于二就是结果
    估计算法: 用基础反射加上基于入射角度的额外反射
    fresnel

  • Normal Distribution Function(NDF) (D项)
    定义微表面法线分布函数
    描述不同粗糙程度的表面 (NDF中lobe是集中在一个点上,还是分布的比较开)
    Concentrated 集中 <==> glossy
    Spread 分散 <==> diffuse
    用不同模型定义NDF:

    • Beckmann NDF
      类似高斯函数 定义在坡度空间
      beckmann
      $\alpha$ 描述法线分布的集中程度即粗糙程度
      $\theta_h$ 宏观表面法线(0,0,1)和半程向量夹角 Beckmann NDF只和$\theta_h$有关,所以是描述各向同性(沿着中心旋转相同结果)的brdf
      用$\tan ^2 \theta_h$不用$\theta_h^2$,$\tan \theta_h$等于无限延申的法线在和半程向量相交的平面和半程向量的距离,这样无论$\tan \theta_h$有多大,$\theta_h$代表的角度都小于90度,就不会出现法线朝下的现象
      Backmann NDF的分母作用为归一化,NDF需要在-1到1的范围内积分

    • GGX NDF
      long tail 衰减到一定程度就会缓慢衰减,即使是在垂直角度仍会有能量反射
      高光周围能看到光晕 边缘更加自然 有过渡 diffuse下,高光覆盖的范围更大更柔和

    • Extending GGX
      GTR longer tails $\gamma$ 等于2,等于GGX,$\gamma$ 越小,尾巴越长,$\gamma$越大,越接近Beckmann

  • Shadowing-Masking Term (G项)
    解决微表面之间的自遮挡问题 计算变暗程度
    shadowingmasking
    左边从light出发发生的微表面遮挡现象叫做Shadowing
    右边从eye出发发生的微表面遮挡现象被称为Masking

    1. darkening现象
      实际计算出的结果会比理想结果亮,所以加上G项使得结果变暗接近理想结果
      用于抵消公式中分母的点乘接近0的情况 (没有G项时 边缘会很亮(分母小))
      The Smith shadowing-masking term 分开shadowing和masking计算
    2. Multiple Bounces
      自遮挡时,光线会在微表面出现多次弹射,G项只考虑了一次BOUNCE,因此当只考虑一次弹射的时候,越粗糙的表面就损失的能量越多,导致能量不守恒,随着粗糙程度变大,渲染得到的结果却越暗
      需要把能量给补回来(材质越粗糙越多沟壑反射光越可能被遮挡能量不断损失 颜色越来越暗)
      离线渲染计算多次弹射类似光追补回能量太慢
      核心思想: 反射光不被遮挡的时候,这些光就会被看到;当反射光被微表面遮挡的时候,认为这些被挡住的光将进行后续的弹射,直到能被看到

      • The Kulla-Conty Approximation
        经验式的方法近似地补全丢失的能量 创建一个模拟多次反射表面反射的附加BRDF波瓣->fms,利用这个BRDF算出消失的能量作为能量补偿项
        把lighting和brdf和cosine积分得出E(μo)即为射出的总能量(在0-1之间)
        1-E(μo)就是丢失的能量
        kullaconty1

        Li都认为是1 也就是rendering equation中的Lighting项是1(因为是1所以式子中没有出现)
        假设BRDF各向同性,与i、o无关
        只计算一个bounce
        意义是在uniform的lighting=1的情况下,在经历了1 bounce之后射出的总能量 E(uo)
        kullaconty10.png

        由于Brdf可逆 要考虑入射丢失的和出射丢失的,需要1 − E(μi)和1 − E(μo)两个项和一个用来归一化的c项来保证结果为1−E(μo) (入射能量Li视为1)
        kullaconty2
        就是设计一种可以交换输入输出方向的brdf->fms,使得它的积分结果正是我们所失去的能量,因此用失去的加射出的能量达到能量守恒
        需要多次积分,打表预计算$E_{avg}$(只依赖于μ0与粗糙度)减少计算量

      • BRDF 有颜色
        有颜色代表有能量被物体吸收 也就是有额外能量损失,也就是单次反射的积分结果不是1
        首先要先不考虑有颜色的情况下把结果算出来,再考虑被吸收掉的能量
        先算出frensel的平均结果$F_{avg}$(不管入射角 平均每次反射会有多少能量反射)
        avgfrensel
        再算E项的平均值$E_{avg}$,$1-E_{avg}$就是会参与后续多次bounce的能量
        第一次bounnce的结果$F_{avg} E_{avg}$多次bounece就多次乘$F_{avg} (1-E_{avg})$补充丢失的能量
        kullacontycolor
        多次反射相加 得出一个级数表示颜色项,把这个颜色项再乘到不计算颜色的计算多次bounce的brdf上,就得到了结果
        colorterm

WRONG: Combining a Microfacet BRDF with a diffuse lobe不考虑能量损失直接加Diffuse项 (会出现自发光) 不正确

常见的Cook-Torrance反射方程:

$f_r = k_d f_{lambert} + k_s f_{cook-torrance}$
$k_d, k_s$分别指入射光线中被折射部分的能量所占的比率与被反射部分的比率(菲涅尔项决定)
$f_{lambert}, f_{cook-torrance}$分别指漫反射和镜面反射的BRDF
漫反射的BRDF是一个常数 $f_{lambert} = \frac{\rho}{\pi}$

$\rho$可以类比光栅化当中的漫反射系数,本质是3维向量,含有物体表面的颜色信息

微表面模型是纯specular的模型,并且通常渲染时只考虑表面单次弹射。所以在非常粗糙的表面(沟壑多),光线被遮挡的几率越高,能量会有损失。加一个diffuse项可以代偿这个能量的损失,尤其是在粗糙度高的表面

但如WRONG所说加一个diffuse项是绝对不符合物理的 一个表面不可能既是diffuse,又是specular的 虽然通过ks + kd = 1来维持了能量守恒,但是这相当于从diffuse项为specular损失的部分凑了能量。其次,这里选择的fd是一个lambertian的brdf,是不随着roughness变化的一个brdf,更真实的diffuse应该随着roughness而发生变化

严谨的做法还应用上述提到的The Kulla-Conty Approximation

镜面反射项如Microfacet BRDF所示

Linearly Transformed Cosines (LTC)

解决微表面模型的shading问题
用多边形的光源 不考虑shadow的shading 主要针对GGX模型,其他模型原理也同样适用

LTC就是在多边形光源的照射下快速求出在ggx模型上不考虑shadow的任意一点的Shading

lobe: 固定一边方向下的brdf的函数图象 BRDF是一个4维的函数,在固定一边之后就变为了2维的函数
lobe
光源方向L固定的情况下,移动反射方向R,当L和R的半角向量=向量N时反射亮度最强,如果继续向上或向下改变R,反射亮度都会减弱 形状像叶片

不用LTC则需要采样 多边形光源上我们需要取很多采样点 速度变慢 为了不采样产生了LTC方法
split sum做的是环境光下的shading

核心方法:

  1. 固定入射方向后,将出射的lobe(brdf的lobe)转变为一个余弦函数
    球面的所有方向经过这个线性变换后使得brdf的lobe朝向向上 且正中间是最大值,依次向周围衰减 像cos一样
    ltc1
  2. 转换Brdf的lobe时,将多边形光源也进行变换
    将四边形光源的四个顶点与shading point相连得到四个方向(向量),让这四个向量也进行相同的线性变换,从而形成新的四边形光源
    此时原光源与brdf结合去照亮shading point = 新光源与cos函数结合去照亮shading point
  3. 将shading point点任意brdf的lobe在任意多边形光源下积分求shading的问题转变为在一个固定cos函数下对任意的多边形光源积分求shading
    此时要积分的东西只是cos,积分的范围虽然各不相同,但可以保证这个范围是一个多边形,而且在这个范围内积分是有解析解的,因此可以帮助我们快速求出shading
    ltc2

ltc3
多边形光源内的任意radiance都是uniform Li拆出来
要通过某种线性变换M把所有的ωi变为新的方向ωi’,从而使F(ωi)变为cos
因为是单位球面所以要归一化
替换进去后引入一个雅克布项J balabalabala 积分有解析解

省流: LTC把变化brdf变化光源通过线性变换变成在固定brdf变化光源问题

Disney’s Principled BRDF

微表面模型的效果虽然很好,但是不能表示出所有的材质,比如真实材质就无法表示 以及多层材质
微表面模型对艺术家来说并不好用

Disney’s Principled BRDF 使用方便 仍属于PBR 并不要求在物理上完全正确
Disney
所有的属性可以混合在一起使用

Non-Photorealistic Rendering (NPR)

非真实感渲染
== stylization 风格化
art driven

通常是一些轻量级的处理,一般是在shader中做一些简单但是很聪明的处理从而完成风格化

Photorealistic Rendering 真实感渲染

NPR:
1.先得到真实渲染的结果
2.通过观察,把Photorealistic变为Non-Photorealistic

  • Outline Rendering 轮廓渲染:

    对Outline的定义:
    contours->整个人物轮廓外围的一圈
    Boundary/border edge->物体外边界上
    Crease->折痕,通常是在两个表面之间的
    Material edge->材质边界
    Silhouette edge->必须是在物体外边界上且由多个面共享的

    • Shading 基于法线
      描边 观察方向向量和着色表面法线向量点乘,如果得到的值接近于0(更改设定的范围从而改变容忍度),说明着色区域是contour edges 粗细不一样
    • Geometry
      把模型背面增大一圈 染成黑 变成边界
      将背面的每个顶点沿着顶点的法线方向向外偏移
    • Image
      图像后期处理 找哪些是边
  • Color blocks
    正常的Shading model算出来的结果进行一个阈值化的操作(thresholding)
    colorblocks
    可以设定多个值 从而拥有更多的色块
    根据需要将不同风格的结果组合在一起,如diffuse和specular都进行阈值化处理,只处理spcular不处理diffuse等组合

  • Strokes Surface Stylization
    素描效果 通过格子密度调整明暗效果
    TAMs

    1. 设计不同密度的纹理表示不同明暗
    2. 设计使其密度不变的mipmap 远处无视距离只和本身密度有关 (缩小图片却不改变密度)
      Strokes Surface Stylization

NPR做的效果好与坏,其实根本上取决于photorealistic模型,而不是后期的各种处理

For volumes 基于体积


深入学习:
https://www.zhihu.com/collection/751205415
https://zhuanlan.zhihu.com/p/20091064
PBR总体框架:
PBR-Architecture

×

喜欢就点赞,疼爱就打赏