GAMES202-高质量实时渲染(Real-Time Physically-based Materials)
目录
- Micorfacet BRDF
- F项:Fresnel term
- G项:shadowing-masking term(geometry term)
- D项:Normal Distribution Function(NDF)
- Beckmann NDF
- GGX NDF
- Multiple Bounces
- LTC(Shading Microfacet Models using Linearly Transformed Cosines)
- Disney’s Principled BRDF
- Non-Photorealistic Rendering(NPR)
- Outline Rendering 描边
- Color blocks 色块效果
- Strokes Surface Stylization 素描效果
GitHub主页:https://github.com/sdpyy1
作业实现:https://github.com/sdpyy1/CppLearn/tree/main/games202
Micorfacet BRDF
F项:Fresnel term
Fresnel项(Fresnel term)用于描述光在界面上反射的强度随入射角变化的现象。
对于绝缘体材质
对于导电材质
Snell’s Law(斯涅尔定律)描述的是光在两种介质交界面上传播时的折射行为
如果分为RGB三个通道,三个通道有自己的折射率。
Rs:垂直偏振(s-polarized)反射率
Rp:平行偏振(p-polarized)反射率
因为自然光通常是非偏振光(即含有相等的 s 和 p 偏振分量),所以实际使用时我们取两者的平均来得到总反射率:两者通过平均得到Fresnel平均反射率。
R0是垂直入射下的反射率,可以通过两种介质的折射率获得,他是一个三通道。进一步可以用Schlick’s Approximation来近似出θ角度下的反射率
G项:shadowing-masking term(geometry term)
为了解决微表面的自遮挡问题
下图左边表示光线被遮挡(shadowing),右图是视线被遮挡(masking)
如果没有G项,当视角和法线接近90°时,BRDF分母会接近0,所以BRDF会变得巨大,导致球体一圈变成白色
常用的G项为The Smith shadowing-masking term
把shadowing和masking两种情况分开考虑
他是基于NDF的值来考虑G项的值的
D项:Normal Distribution Function(NDF)
微表面上看法线方向并不是统一的
当法线分布更多在半程向量时,反射光强度更大
glossy和diffuse的表面法线分布情况,glossy的表面分布比较集中
有不同的模型来描述法线分布
- Benckmann、GGX
Beckmann NDF
两个系数来控制分布。阿尔法控制表面的粗糙程度。sita控制半程向量和法向量的夹角
圆心是着色点,红色是微观法线。黑线是宏观着色点法线。他们的夹角就是sita,把红线延长到上面的一条线上。用tansita来定义分布
所以说Beckmann NDF是定义在tanθ上的高斯分布
GGX NDF
它的尾巴比较长,如下图橙色尾巴很长。而beckmannNDF在90°时已经衰减为非常接近0。如果把高出定义为高光,那backmannNDF高光周围会迅速衰减。而GGX会缓慢衰减,形成光晕的效果
下图可以看出backmann高光周围比较尖锐。GGX比较平滑
所以说GGX的长尾可以带来自然过渡的效果。
GGX的拓展
定义参数gamma,调整尾巴衰减速度
Multiple Bounces
现在已经学习了BRDF的FGD三项的构成。但是这样渲染出来还有问题。随着roughness的增加,模型逐渐变暗了。下面一行是在做能量损失实验,说明roughness越大,能量损失越多了
这种能量损失体现在,越粗糙的表面法线分布更容易被挡住
所以要考虑多次bounces,有相关的论文,但是对于实时渲染太慢了
所以现在有了基于经验补全的方式,kulla-Conty Approximation
首先根据渲染方程,假设输入的L=1,计算输出的能量是多少
所以1-E(u0)就是损失的能量(E与观察方向有关系,所以不同的视角下损失能量是不一样的),最后补上这部分能量。
具体怎么算出来就不看了。最终损失能量依赖于观察方向和粗糙度两个变量。所以直接预计算打表即可。
补充前后对比
LTC(Shading Microfacet Models using Linearly Transformed Cosines)
LTC 最初是由 Tobias Ritschel 等人在论文《LTC - A Fast and Efficient Approximation of Fresnel Terms and Distribution of Normal Vectors for Real-Time Rendering》提出的,它被设计为一种方法来 近似反射分布函数(BRDF)
Fresnel项 和 法线分布函数(例如 GGX)是微面模型的关键组成部分,这些函数非常复杂,计算成本较高。LTC 使用线性时间编码(Linear Time Coding)来近似这些复杂的分布,使得实时渲染时可以快速计算这些项。
综上LTC是一种对BRDF项的预计算
首先,它是有限制的。主要是在GGX的法线分布下、没有阴影、多边形光源
主要思想是任何BRDF lobe 都可以通过一个变换转化为一个余弦函数
实际实现比较复杂,课程没提到
Disney’s Principled BRDF
首先介绍了为什么有了微表面BRDF还需要Disney的BRDF
它被称为principled的BRDF,可以通过调整参数来达到想要的效果,所以他是艺术家友好的
介绍一下里边的名词
- subsurface(次表面反射):光线进入表面后并不会直接反射回去,而是穿透表面并在内部多次散射,最终可能以不同的方向从表面射出。
- metallic(金属性)
- specular(镜面)
- specularTint(镜面颜色):specularTint 是一个与 镜面反射(Specular Reflection)相关的参数,用来控制反射光的颜色如何与 材质本身的颜色混合。也就是说镜面反射光不是单纯的白色,而且受表面材质颜色的影响
- anisotropic(各向异性):述材料或表面在不同方向上具有不同物理特性的术语
- sheen(沿着球的表面有绒毛雾化效果)
- clearcoat(添加一层镀膜)
Non-Photorealistic Rendering(NPR)
Outline Rendering 描边
先来看看有哪些Outline,B表示自己的边界,S表示两个面交界处形成的边界,C是折痕,M是材质边界
知道了边界,下来就需要描边,可以通过Shading或者图像处理来完成。首先来介绍Shading方法,哪些像素点是S边上呢,根据观察,就是法线与观察方向=之间夹角接近垂直的像素点。可以设置夹角的阈值,来改变边的粗细
另外就是外扩法,之前learnOpenGL里有
另外看一下从图像上来处理
Color blocks 色块效果
直接把渲染结果量化,就是连续值变成离散
Strokes Surface Stylization 素描效果