Lecture 10 Real-time Physically-based Materials (surface models and cont.)
PBR and PBR Materials
-
Physically-Based Rendering (PBR) 基于物理的渲染
-
渲染内的任何事都应该是PBR的
-
材质、光照、相机、光线传播等等
-
不限于材质,但常常指材质
-
-
PBR materials in RTR
- 实时渲染中材质的丰富程度远落后于离线渲染
- 实时渲染中的PBR常常不基于物理
- 在surfaces上,主要是微表面模型和Disney principled BRDFs
- 对美术友好,但仍不是PBR
- 轻量级,运算量小
- 在volumes上,主要集中在快速、近似的单散射和多散射(云、头发、皮肤等等)
- 一般都不是新理论了,而且离线渲染方法的一些hacks
- 性能仍然是考虑的关键因素
Microfacet BRDF 微表面
微表面各自的法线各不相同,而这些法线的分布会让最后渲染结果看着各不相同
\[f(i,o)=\frac{F(i,h)G(i,o,h)D(h)}{4(n,i)(n,o)}\\ Fresnel项决定有多少能量被反射\\ G项表示shadowing-masking\\ D项描述了法线分布\\ 分母包含法线和入射方向、法线和出射方向点乘 \]假设每个微表面是specular镜面,考虑BRDF,已经入射方向和出射方向,只有当微表面法线与半程向量一致时,入射光才能打到出射光方向
The Fresnel Term
当入射方向与法线的掠角近乎垂直时,反射的光线最多
对于绝缘体来说也差不多是这个曲线,垂直看反射会少,从grazing angle斜着看会更多
对于非绝缘体来说也差不多是这个曲线,垂直看反射会少,从grazing angle斜着看会更多,这里能量都很高是因为金属表面反射多
所以Fresnel项告诉我们有多少能量被反射
Fresnel项还有考虑S极化和P极化,计算比较复杂,一般用下面的公式近似
\[R_0$$是基础反射,加上一个某种曲线将其拉到是grazing angle时是1 当$$\theta$$是0或1时,$$R(\theta)$$等于$$R_0$$或$$1\]Normal Distribution Function (NDF) 法线分布函数
- 与正态分布无关
- 有非常多模型描述它
- Beckmann
- GGX (工业界常用)
- 等等
Key: 微表面法线的分布
-
分布在球面上,是二维函数
- 要将半球描述在圆上,可以将其“拍扁”(projected solied angle)
-
当微表面法线方向比较集中时,物体是Glossy的
-
当微表面法线方向非常集中时,物体的Specular的
-
当微表面法线方向分散的,物体是Diffuse的
-
在微表面上下做一个scale,会让其法线分布更加分散,且沟壑更深
Beckmann NDF
- 类似高斯
- 定义在slope space坡度空间
要控制NDF lobe的宽窄(集中在一个点上还是分得比较开),在Gaussian上用标准差$$\sigma$$控制
从公式中的指数项可以看出
-
\[\alpha$$起的是这个作用,描述法线的粗糙程度,粗糙程度越小越像specular,越大越像diffuse
\]
在坡度空间,下面的横线是物体表面,围绕shading point作一单位圆,垂直它的线是物体法线,斜线是微表面法线,二者夹角是$$\theta$$,这里的$$\tan\theta$$表示的是,过物体法线顶端作一切线,微表面法线继续延长,打到切线后与法线的距离
反映到二维的情况,就是过法线顶端作一切平面,微表面法线打到切平面
这样就把在角度上定义一个高斯函数转变成在平面上定义一个高斯函数
高斯函数有一个性质,它的support是无限大的(虽然过了$$3\sigma$$后衰减得非常小,但永远不是$$0$$)
定义在slope space(切线上)上的好处是,在切线上可以走的非常远,但是其对应的角度一定在$$90$$度以内,可以保证不出现面朝下的微表面,但是还是会出现反射光出射方向朝下
-
分母项是为了保证归一化,大家希望它在projected solid angle上积分为$$1$$,保证所有微表面投影到宏观表面相等,能量守恒
单位圆的覆盖是$$[-1,1]\times[-1,1]$$
GGX
GGX (or Trowbrigde-Reitz) GGX或TR模型
典型特征:long tail 长尾巴
GGX模型也想高斯一样会很快衰减,但是衰减到一定程度(到grazing angle)时仍然还有一定能量
NDF函数的峰值代表了高光,Beckmann的高光部分衰减很快,而GGX有平滑过渡
- GGX能够带来光晕现象。可以看到白天图2的对比,Beckmann的高光边缘很锐利,而GGX有一圈光晕
- Beckmann只看到一个高光,而GGX因为衰减慢不会。白天图4中,高光范围很大,而Beckmann的高光戛然而止,GGX有平滑过渡
Generalized Trowbridge-Reitz GTR
GGX的改进
定义了一个参数$$\gamma$$,当$$\gamma$$等于$$2$$时就是GGX,$$\gamma$$越小尾巴越长,若$$\gamma$$超级大则接近Beckmann,相当于将Beckmann和GGX结合在一起,并且可以继续衍生
Shadowing-Masking Term
也叫G项,the geometry term
解决微表面之间的自遮挡问题,这个问题在grazing angle时尤其严重
左图入射光被遮挡,属于Shadowing,右图出射光被遮挡,输入Masking
这一项会使结果变暗,因为剔除了Shadowing和Masking的光线
当靠近垂直地看向物体时,遮挡现象几乎没有,G项为1,而当处于grazing angle时,遮挡现象严重,G项剧烈地减少至0,这样可以避免当处于grazing angle看向物体时物体过亮
The Smith shadowing-masking term
假设法线分布是某种统计学分布,在这种情况下推出一个shadowing-masking项,通常还会将shadowing和masking拆开(假设二者没关系,而事实上二者是有关系的)
\[G(i,o,m)\approx G_1(i,m)G_1(o,m)\\ m是半程向量 \]红线是Beckmann,绿线是GGX,二者在垂直入射时基本都为1,不起作用,在grazing angle上发生剧烈的遮挡,使BRDF变小
Multiple Bounces
这里一排从左到右roughness越来越大
加上shadowing-masking后,grazing angle时过亮的问题解决了,但是随着roughness增大,发现物体亮度变小
第二行处于一个空的背景,环境光照各处一样,但是roughness增大产生了能量损失(结果变黑),这个测试叫做white furnace test 白炉测试
当法线分布越分散时,当光线打到微表面时,越容易被别的微表面挡住,所有当微表面完全光滑时没有被挡住,能量没有损失,而随着roughness增大,若只考虑一次bounce,损失的能量也就越多
解决方法:将丢失的能量补回去
-
准确的方法:[Heitz et al. 2016],这是一种模拟的方法,慢
-
补能量的基本思想是对的
-
反射光未被微表面挡住,光线出去,没有能量损失
-
反射光被微表面挡住,光线需要发生更多次bounce,直到其离开微表面
所以被遮挡和发生下次bounce是完全一致的概念
-
The Kulla-Conty Approximation
通过一种经验性的方式补全能量的丢失,只考虑一次反射的情况,是一种Hack
\[E(\mu_0)=\int_0^{2\pi}\int_0^1f(\mu_0,\mu_i,\phi)\cos\theta\sin\theta \mathrm{d}\theta\mathrm{d}\phi\\ E(\mu_0)=\int_0^{2\pi}\int_0^1f(\mu_0,\mu_i,\phi)\mu_i\mathrm{d}\mu_i\mathrm{d}\phi\\ \mu=\sin\theta\\ 这个公式是将BRDF和\cos、lighting一起做了个积分\\ f是BRDF项,这里认为\phi和i和o无关\\ 认为入射光Lighting项是常数1\\ \]-
没有看见$$\cos$$项?
如果要将一个球面展开成对$$\theta$$和$$\phi$$的积分来表示,对应的立体角就是$$\sin\theta\mathrm{d}\theta\mathrm{d}\phi$$,这里定义了$$\mu=\sin\theta$$,
就可以写成$$cos\theta\sin\theta \mathrm{d}\theta\mathrm{d}\phi=\sin\theta\mathrm{d}\sin\theta\mathrm{d}\phi=\mu\mathrm{d}{\mu}\mathrm{d}\phi$$
如果积分$$\theta$$的话是从$$0$$到$$\frac{\pi}{2}$$,换元后变成 $$0$$到$$1$$
积分结果就是bounce一次后出去的总能量,介于$$0$$到$$1$$,那么被遮挡掉的能量就是$$1-E(\mu_o)$$
要补上剩余的能量,需要补上另外一种BRDF表示多次bounce,而BRDF是可逆的(也就是对称性),因此BRDF形式应该是$$c(1-E(\mu_i)(1-E( \mu_o))$$,$$c$$用于归一化,可以是常量或者函数
\[f_{ms}(\mu_o,\mu_i)=\frac{(1-E(\mu_o))(1-E(\mu_i))}{\pi(1-E_{avg})}\\ E_{avg}=2\int_0^1E(\mu)\mu\mathrm{d}\mu \]这里的$$E_{avg}$$还是一个积分,仍然不知道
-
在split sum中可以得知,对于这样一个困难的积分可以通过以下方法解决
- 预计算
- 打表
- 并且需要考虑存储开销,那么参数维度不能太高,这里简单总结积分结果依赖于观测方向$$\mu_o$$和roughness,就可以预计算,打成一张二维的表
-
如果BRDF有颜色呢?
颜色吸收能量损失(这部分损失是应该的)
所以应该计算整体能量损失
-
定义一个平均Fresnel项(平均损失能量)
\[F_{avg}=\frac{\int_0^1F(\mu)\mu\mathrm{d}\mu}{\int_0^1\mu\mathrm{d}\mu}=2\int_0^1F(\mu)\mu\mathrm{d}\mu \]F的积分除以空积分等于平均值
\[E_{avg}$$是一次bounce后能被看见的能量,那么只有$$1-E_{avg}$$参与后续更多bounce \]- 能之间看到的:$$F_{avg}E_{avg}$$
- 第2次bounce才看到:\(F_{avg}(1-E_{avg})\cdot F_{avg}E_{avg})\)
- 第k次bounce才看到:\(F^k_{avg}(1-E_{avg})^k\cdot F_{avg}E_{avg})\)
- 将这些项加起来,能得到一个级数,这就是颜色项:\(\frac{F_{avg}E_{avg}}{1-F_{avg}(1-E_{avg})}\)
- 将颜色项乘到不带颜色的多次bounce的BRDF上就能得到最终结果了
- 这些项都是三通道
一种Undesirable Hack
有人会给微表面加上一个diffuse lobe,在计算机视觉中为了分析物体材质会这么做
但是这样在图形学中是完全错误的,但是工业界确实有这样用的
因为微表面是将物体解释成微表面,那么其分布是清楚的,既然已经在微表面中考虑了分布,就不应该有diffuse了
- 问题
- 物理错误
- 不满足能量守恒,这样会得到错误的会发光的BRDF
- 对于不同的角度、roughness,损失的能量都不一样
- 现在也有人在研究如何在加上这个diffuse后保证能量守恒,但还没有任何发表
Disney principled BRDF
Disney pricipled BRDF常常是经验性的模型
为什么需要?
- 微表面模型很强,但是并不适合表示真实的材质,比如微表面模型并不怎么diffuse
- 比如刷了清漆的桌子,清漆(无颜色)有厚度但不吸收光,有Fresnel项,光线进入清漆会被反射掉,而清漆表面很平坦,所以会有高光,而打进去的光肯定会碰到里面的木桌子,变成diffuse的形状往外走,就会导致物体表面又有高光,又有diffuse,这种情况解释不了因为微表面模型顶多解释其中一层
- 微表面模型不好用,PBR的参数大都是物理量,对美术工作者不友好,比如金属折射率是复数
因此Disney principled BRDF有以下特点
- Art directable,不一定要求物理正确
- 但是人们一般还是认为这种材质在实时渲染中属于PBR
principled
- 比起物理量参数,更应使用直觉上的参数(更平、更亮...)
- 参数尽量少
- 参数看起来是从0到1的拖动条(实际上不一定是0到1)
- 有必要的话参数调可以超过$$(0,1)$$
- 所以参数组合应该要是靠得住的
好处与坏处
- 易于实现/控制
- 用一种模型表示非常大范围的材质
- 开源实现
- 不基于物理
- 牺牲了准确性却带来了很多好处
- 巨大的参数空间
- 参数空间大,表示能力强
- 但是坏处是带来了冗余现象
- 拟合了能量守恒,如果不考虑拟合误差的话,就是能量守恒的
Non-photorealistic rendering (NPR)
非真实感渲染 == (快速且可靠的)风格化
-
从真实感渲染开始
-
Exploits abstraction
-
增强重要部分
-
Styles
- 描边
- 色块
Outline Rendering
-
Outline并不只是contours
-
[B]oundary / border edge 边界
-
[C]rease 折痕
-
[M]aterial edge 材质边界
-
[S]ilhouette edge 物体的外边界&&多个面共享的边界
-
描边有两种思路:shading、Geometry或者后处理
-
Shading normal contour edges
- Silhouette edge一定是有两个面,一个面被看到,一个面不被看到才形成边界
- 也就是法线几乎垂直观察方向
- 如果容忍的阈值越高,描边也就越粗
- 应用一个阈值也就是一个step function分段函数(包括带过渡的)
- 如果法线变化平缓,描边就粗,否则描边就细,这种情况不好
- Silhouette edge一定是有两个面,一个面被看到,一个面不被看到才形成边界
-
在Geometry层面
- Backface fattening 法线外扩
- 正常渲染正面
- 扩大背面,然后再渲染背面
- 外扩通过顶点法线
- 一些优化
- 比如三角形尖锐的拐角变成圆角过渡
- 不同边往不同vertex方向扩(沿法线方向外扩更均匀)
- Backface fattening 法线外扩
-
在后处理层面
-
在图像上找边缘
退化到给一张图,如何找到边界
-
通常使用Sobel detector
Sobel detector用来做filter
设计不同filter kernel
-
比如第一个kernel,如果周围很平均,左右的格子相互抵消
如果出现一条竖线,那么竖线周围肯定有明显区别,一边乘上正数一边乘上负数,导致两边结果会被进一步拉大,就将结果提出来了
同理图中第二个kernel是提取边缘,两种结合到一块就能找到边界
-
图像处理上有一种操作叫锐化,找到图像上高频的边界,再加回到原图上,用来强调图像边界
-
-
![16](./Assets/Lecture 10 & 11 Real-time Physically-based Materials (surface model.).assets/16.png)
不一定在最后的图像上操作,比如法线图、深度图等屏幕空间信息都可以加以利用。
比如图中鞋子的边缘在深度图中看不出,但在法线图中可以看出,所以综合利用各自屏幕空间信息找边界可以更加干净
-
-
Color blocks
色块的处理方法也有两种,但都是通过阈值化,如果超过阈值是一个值,没超过是一个值
阈值化不一定是二值化,也可以是多值化,不同区间不同数值
- Hard shading
- 后处理
![17](./Assets/Lecture 10 & 11 Real-time Physically-based Materials (surface model.).assets/17.png)
不同风格的渲染结果也可以自由组合
Strokes Surface Stylization 素描效果
![18](./Assets/Lecture 10 & 11 Real-time Physically-based Materials (surface model.).assets/18.png)
![19](./Assets/Lecture 10 & 11 Real-time Physically-based Materials (surface model.).assets/19-1720491186847-3.png)
- 通过格子密度来营造明暗效果
- 用预生成不同密度的stroke texture替换
- 不能每个点单独计算了
- 原先亮的地方没有什么格子,而暗的地方格子密度大,相当于是一个反的转换
- 不同的点之间存在一些过渡,可以从不同密度的stroke texture同坐标取值
- 密度
- 密度变化的过程要比较连续
单纯用纹理实现会存在一个问题,当物体远离cameara时,密度会增大,显得物体变暗
- 在远处uv会缩小
- 所以可以通过mipmap实现
- 这里的mipmap是将纹理缩小了,但缺不改变密度
- 手搓mipmap?
总结
- NPR是art driven的
- 需要将artist的需求翻译成rendering insights
- 比如描边
- 需求多与美术交流
- 有时每个角色渲染方式不同,甚至每个部分
- Photorealistic模型对NPR极其重要
Shading Microfacet Models using Linearly Transformed Cosines (LTC)
-
解决微表面模型的shading问题
- 主要用于GGX,其他模型也可以
- 不考虑阴影
- 不同类型的光源下,比如多边形光源
-
知道入射方向的情况下,BRDF就变成一个2D lobe了
- BRDF是四维函数(输入输出两个方向的函数,二者都是$$\theta和\phi$$的两维)
- lobe类似花瓣的瓣,固定了观察方向,那么它反射出去的分布画出来像花瓣,称为lobe
-
如果没有LTC,要解决多边形光源照射问题,需要在多边形光源上采样点,和shading point连线 ,看中间是否被挡住,计算阴影(也可以不计算阴影),但无论如何都需要采样
-
LTC要做的是输入一个多边形光源,立刻将微表面模型的shading算出来
-
Key idea
-
任何2D BRDF lobe都可以通过某种线性变换变换成一个余弦函数
-
光源的形状也能被变换
-
对于一个shading point来说,它的BRDF可以各不相同,而又给与任意光源,在这个光源覆盖的立体角内不好做渲染方程的积分
而通过上面的变换,BRDF变成一个$$\cos$$,多边形光源变换后变成另一个多边形光源,假设多边形内部的radiance是均匀,这样就将任意BRDF lobe在任意多边形光源下的shading问题转换成了在一个固定$$\cos$$下对于任意多边形光源进行积分的问题,这个积分是有解析解的(所以情况都对$$\cos$$进行积分,只是积分范围各不相同)
-
各向异性的BRDF也能用,因为给定了观察方向,无论如何都会对应一种形状的BRDF lobe
-
观察
论文中说任何一个$$\cos$$域可以经过某种变换换出多边形域,多边形域通过逆变换变成$$\cos$$域
- BRDF经过逆变换变成$$\cos$$域
- 那么所有的方向也应该要做相同变换得到新方向
- 积分域也要变换(因为多边形光源覆盖的方向变换了)
实现
- 假设多边形光源覆盖的立体角区域都是同一个$$L_i$$,所以提到积分外边\[L(\omega_o)=L_i\cdot\int_PF(\omega_i)\mathrm{d}\omega_i\\ \omega_i=\frac{M\omega_i'}{\lVert M\omega_i'\rVert}\\ 原方向\omega_i'后不能保证新方向\omega_i'还在单位球面上,所以要做归一化\\ 所以就可以用新方向来描述式子\\ L(\omega_o)=L_i\cdot\int_P\cos(\omega_i')\mathrm{d}\frac{M\omega_i'}{\lVert M\omega_i'\rVert}\\ Jocobi项换元,将对函数的积分转变成对参数的积分\\ =L_i\cdot\int_P\cos(\omega_i')J\mathrm{d}\omega_i'\\ M的求法可以通过给定初始值然后优化方法得到或者解析解 \]
Volumetric / scattering materials
- 太多依赖
- RTE 散射介质中光线如何传播
- BSSRDF 次表面散射
- single/multiple scattering
- etc.