实时渲染中的PBR材质分类:
1.微表面材质
2.体积材质
BRDF公式
brdf f(i,o)描述的是对于一个入射方向的光,有多少能反射出去
Fresnel Term
与入射角有关:
入射方向和normal越接近90度,反射越多
绝缘体(如水,玻璃)反射系数
导体(如金属)反射系数
计算公式:
是入射角度,
为90度时,R(
) = 1, 为最大值,
为0度时,R(
) = R0,为最小值
Normal Distribution Function(NDF)
微表面法线分布
微表面法线方向越统一-->越是glossy
微表面法线方向越杂乱-->越是diffuse
NDF描述的是半球面的法线分布--》怎么表示为二维?--》球体拍扁后的球面分布 (projected solid angle, 单位积分为1)
NDF模型种类
1.Beckmann
2.GGX
1.Beckmann分布
与高斯分布类似(高斯分布 - 知乎 (zhihu.com)),h 是法线与半程向量h的夹角,
h越接近法线,分布的越多,
h离法线越远,分布的越少
tan
限制了
角度不会超过90度,保证微平面法向不会出现向下的情况,分母部分是在projected solid angle 积分归一化后产生的。
2.GGX(or Trowbridge-Reitz) 分布
特点:长尾, 高光消散的慢
这里的m 等于半程向量h, 表示粗糙度
Geometry Term
表示微表面自遮挡问题,某一微表面会挡住其他微表面,尤其是入射或出射光线接近掠射角的时候(grazing angle)
红色圈起来的部分会被挡住,无法反射光线 ,左图称作shadowing,右图称作masking
由于这些遮挡,输出会变暗--》在靠近grazing angle(90度)的时候会,输出会剧烈减少
(m = halfvector)
例子:
如果没有G像,grazing angle处,分母(n点乘i)为0, f会巨大,出现白边
Multiple Bounce 造成的能量损失
粗糙度越高,物体越暗,沟壑越深,反射光越容易被其他微表面挡住,但multi bounce的能量没被计算进去
解决方法:
补光--》
被微表面挡住意味着要发生下次bounce弹射
方法 Kulla-County
渲染方程:
可化简为:
u0为入射方向(观察方向),观察方向不同,被遮挡的概率不同
损失的能量就是 1-E(u0)
推导过程:
Eavg通过打表计算
最终结果
有颜色的情况(光线会被吸收)
补光项:(推导略)
参考自:Lecture10 Real-Time Physically-based Materials (surface models)_哔哩哔哩_bilibili
Linearly Transformed Cosine (LTC)
针对GGX的,多边形光源的,无shadow的 微表面着色问题
参考:LTC(Linearly Transformed Cosines)研究与URP实现 - 知乎 (zhihu.com)
Diseny‘s Principle BRDF
引入原因--》
1.微表面模型解释不了多层材质,如车漆(clear coat)
2.微表面模型参数不友好(物理参数范围不好理解)
参数范围都在0-1之间,且可以混合叠加
specularTint -->specular效果篇白,还是篇黑,(反射画面的强度)
sheen -->天鹅绒,参数越大,球表面绒毛越多
clearcoat--》清漆光滑层度