前言
本章主要介绍贴图(本章的参数)与上两章中的公式之间的映射,这种映射主要时为了用户或者美术能够方便的观察和调试参数。这个映射会影响最终效果。
参考资料
- Google Filament
- [Burley12] Brent Burley. 2012. Physically Based Shading at Disney. Physically Based Shading in Film and Game Production, ACM SIGGRAPH 2012 Courses.
- [Lagarde14] Sébastien Lagarde and Charles de Rousiers. 2014. Moving Frostbite to PBR. Physically Based Shading in Theory and Practice, ACM SIGGRAPH 2014 Courses.
Disney BRDF参数
- baseColor:表面颜色,通常用纹理贴图提供
- subsurface:通过次表面近似来控制漫反射形状(controls diffuse shape using a subsurface approximation)
- metallic:0为电介质;1为金属。这是两个模型的线性混合参数。金属流没有diffuse量,反射是会带上baseColor的颜色(tinted incident specular)。
- specular:入射光的反射量,这是显示折射率(IOR)的代替
- specularTint:对反射颜色调色,让艺术家能够将反射颜色朝向baseColor
- roughness:表面粗糙度,同时控制diffuse和specular
- anisotropic:各向异性的程度,控制镜面高光的纵横比;0=各向同性,1=各向异性
- sheen:光泽,额外的掠射角量,主要用于布料
- sheenTint:类似specularTint,对sheen效果进行调色,让sheen光泽趋向于baseColor
- clearcoat:清漆,一种特殊用途的高光波瓣
- clearcoatGloss:控制清漆光泽度(0=缎外观satin appearance,1=光泽外观gloss appearance)
Google Filament
图片来源:Figure 17 in https://google.github.io/filament/Filament.html
- BaseColor:非金属材质为diffuse albedo;金属材质为specular color。Linear RGB,[0…1]
- Metallic:0为电介质;1为金属导体。一般是0或者1的二值贴图。[0…1]
- Roughness:粗糙度。[0…1]
- Reflectance:对电介质表面,垂直光照的菲涅尔反射 F 0 F_0 F0;可代替IOR。[0…1]
- Emissive:额外的漫反射参数,用来模拟发射表面(emissive surface),如霓虹灯neons等。在HDR管道中的bloom步骤中有很大作用。Linear RGB[0…1]+曝光补偿
- Ambient Occlusion:定义表面点可以得到的环境光的数量,介于0到1之间的每个像素阴影系数。[0…1]
- Anisotropy:各向异性的程度,控制镜面高光的纵横比;0=各向同性,1=各向异性
- ClearCoat:清漆,一种特殊用途的高光波瓣。[0…1]
- ClearCoatRoughness:控制清漆粗糙度(1=缎外观satin appearance,0=光泽外观gloss appearance)。[0…1]
- SheenColor:反射颜色调色,用来创建两个色调的镜面织物(默认0.04以匹配标准反射率)
- SubsurfaceColor:对材质散射和吸收后的漫反射颜色进行调色
下图为当Metallic=1,roughness=0.8时,ClearCoat从0到1的效果图
图片来源:Figure 25 in https://google.github.io/filament/Filament.html
下图为当Metallic=1,roughness=0.8,ClearCoat=1.0时,ClearCoatRoughness从0到1的效果图
图片来源:Figure 26 in https://google.github.io/filament/Filament.html
下图为Anisotropy从0到1的效果图
图片来源:Figure 28 in https://google.github.io/filament/Filament.html
这里的参数范围是shader代码所希望得到的,在UI或者用户交互时,应该使用更直接的数据格式。例如,BaseColor一般会用sRGB呈现给用户,在渲染前转换为线性RGB空间给到shader。
Filament参数的Remapping
BaseColor Remapping
材质的base color会收到metallic的影响,如下:
vec3 diffuseColor = (1.0 - metallic) * baseColor.rgb;
反射率映射
使用在[Lagarde14]中对电介质进行映射:
F
0
=
0.16
⋅
r
e
f
l
e
c
t
a
n
c
e
2
F_0=0.16\cdot reflectance^2
F0=0.16⋅reflectance2
这是为了将specular图映射到一个区间,可以合适表示电介质(4% reflectance)和宝石(8%-16%)的菲涅尔值。在该映射中,在线性RGB灰度空间的128(或者0.5)所对应的菲涅尔反射率(Fresnel reflectance)为4%。
图片来源:Figure 18 in https://google.github.io/filament/Filament.html
如果折射率(IOR)已知,例如空气-水的IOR为1.33,其菲涅尔反射率:
F
o
=
(
n
i
o
r
−
1
)
2
(
n
i
o
r
+
1
)
2
F_o=\frac{(n_{ior}-1)^2}{(n_{ior}+1)^2}
Fo=(nior+1)2(nior−1)2;
同样如果已知菲涅尔反射率,其IOR:
n
i
o
r
=
1
1
−
f
o
−
1
n_{ior}=\frac{1}{1-\sqrt{f_o}}-1
nior=1−fo1−1
下面列举了常见的反射率,现实世界中,没有小于0.02的材质。
图片来源:Table 4 in https://google.github.io/filament/Filament.html
对于导体(金属)而言,
F
0
=
B
a
s
e
C
o
l
o
r
⋅
m
e
t
t
a
l
i
c
F_0=BaseColor\cdot mettalic
F0=BaseColor⋅mettalic
下图列举了几种常见金属的
F
0
F_0
F0,值得注意的是这些值是sRGB,在使用的时候应转换为Linear RGB。
统一一起,代码如下:
vec3 f0 = 0.16 * reflectance * reflectance * (1.0 - metallic) + baseColor * metallic;
Roughness
用户设置的粗糙度一般称为perceptualRoughness,其映射公式为:
α
=
p
e
r
c
e
p
t
u
a
l
R
o
u
g
h
n
e
s
s
2
\alpha=perceptualRoughness^2
α=perceptualRoughness2
上图的上半部分是使用映射的,下半部分是没有使用映射;可以发现不适用映射,高亮的金属的粗糙度范围很小[0.0,0.05]。在[Burley12]中指出,简单的平方映射以最小的计算代价得到一个好的视觉和感官效果。在实际运用中,一般会用到
α
−
2
\alpha^{-2}
α−2,这样对于非常小的roughness则会带来一些溢出问题(出现除0),特别是使用半精度浮点的手机GPU上。
半精度的最小值为 2 − 14 2^{-14} 2−14或 6.1 × 1 0 − 5 6.1\times 10^{-5} 6.1×10−5,为了使 α 2 \alpha^{2} α2不小于这个值,一般会将perceptualRoughness截取的0.089,此时, α 2 = 6.274 × 1 0 − 5 \alpha^{2}=6.274\times 10^{-5} α2=6.274×10−5。
而且,如果想高光具有一个最小大小(roughness=0基本没有高光),我们也需要将perceptualRoughness限制在一定的范围;同样,过小的roughness还会带来反射锯齿。在Frostbite引擎中,perceptualRoughness会截取到0.045来抗锯齿。
小结
BaseColor:尽量排除光照信息, except for micro-occlusion.
Metallic:大部分应该是一个二值,0代表非金属,1代表金属。尽量使得值靠近0和1,中间值表示的是表面类型的过渡。
非金属:
BaseColor代表的是反射颜色,sRGB值应该是在50-240 (strict range),或者30-240 (tolerant range).
Reflectance:如果不知道是多少,可以设为127 sRGB,即线性RGB的0.5,代表4%反射率。在sRGB空间不应该低于90,即线性RGB的0.35,代表2%反射率
金属:
BaseColor代表的是反射颜色和反射率。使用sRGB在170-255,代表亮度在67%-100%。氧化或者脏的金属可以更低。
Reflectance:该参数会被忽略,从BaseColor中计算得到。