Filament Materials Guide
Introduction
?? 材质第二部分基础是Filament的材质框架使用指南,对于理解其材质框架很有帮助。本章还是以笔记为主。学习文档来源于官方文档:
- https://github.com/google/filament/tree/main/docs/Materials.html
相关术语与概念
-
Material
- Material 定义了物体表面所展示的视觉效果。为了完整描述和渲染某一物体表面。Material 提供了如下信息:
- Material Model
- 一组使用可控(use-controllable )的命名参数
- 光栅状态 (blending mode, backface culling, etc.)
- Vertex shader code
- Fragment shader code
-
Material Model
- Material Model也称Shading Model 或 Lighting Model
- 用于定义物体表面的固有特性
- 这些特性直接影响光照的计算方式,从而影响渲染出的物体表面外观
-
Material Definition
- 描述某种材质需要的所有信息的文件
- Filament工程中.mat后缀的文件
-
Material Package
- 使用matc工具根据Material Definition定义的材质(*.mat)编译获得
- Filament工程中.filamat后缀的文件
- 运行时,从*.filamat后缀的文件中加载材质
- Material Package 包含描述材质信息的所有信息
- 也包含为运行时所使用系统平台生成的Shaders
- 因为不同的平台(Android、macOS、Linux等)使用不同的图形API或者某种图形API的不同变体(如OpenGL和OpenGL ES)
-
Material Instance
- Material Instance 是对材质的引用
- 就像类和对象的关系,Material (类), Material Instance(对象)
- Material Instance 可以根据Material 提供的参数设置不同于Material 的参数值
Material Models
- Filament 的材质模型有以下几类
- Lit (or Standard)
- Subsurface
- Cloth
- Unlit
- Specular glossness (legacy)
Lit Model
- Lit Model是Filament的标准材质模型
- 是基于物理的着色模型
- 与常用工具和引擎有很好的互操作性
- 如Unity 5、Unreal Engine 4、Substance Designer,以及Marmoset Toolbag
- 该材质模型可用于描述许多非金属表面(dielectrics)或金属表面(conductors)
- 该材质模型的材质外观属性由如下参数控制
- baseColor
- 非金属表面的diffuse albedo或金属表面的specular color
- 类型 float4
- 范围 [0…1]
- Pre-multiplied linear RGB
- metallic
- 绝缘体为0.0;金属为1.0
- 通常使用二进制数表示
- 类型 float
- 范围 [0…1]
- roughness
- 感知平滑度(1.0)或粗糙度(0.0)。
- 光滑的表面会产生尖锐的反射
- 类型 float
- 范围 [0…1]
- reflectance
- 介质表面在正常入射时的菲涅耳反射。
- 直接控制反射的强度
- 类型 float
- 范围 [0…1]
- (建议值)Prefer values > 0.35
- sheenColor
- sheen layer 的强度
- 类型 float3
- 范围 [0…1]
- Linear RGB
- sheenRoughness
- sheen layer的感知平滑度或粗糙度
- 类型 float
- 范围 [0…1]
- clearCoat
- clear coat layer的强度
- 类型 float
- 范围 [0…1]
- 需是0或1
- clearCoatRoughness
- clear coat layer的感知平滑度或粗糙度
- 类型 float
- 范围 [0…1]
- anisotropy
- tangent 或bitangent方向上的各向异性值
- 类型 float
- 范围 [-1…1]
- 当此值为正时,anisotropy在切线方向
- anisotropyDirection
- Local surface 的方向
- 类型 float3
- 范围 [0…1]
- Linear RGB,在切线空间中对方向矢量进行编码
- ambientOcclusion
- 定义着色点可以访问多少环境光。它是介于0.0和1.0之间的逐像素阴影因子
- 类型 float
- 范围 [0…1]
- normal
- 法线贴图,用于扰动曲面细节法线的bump mapping
- 类型 float3
- 范围 [0…1]
- Linear RGB,在切线空间中对方向矢量进行编码
- bentNormal
- 指向当前着色位置的一个不被遮挡的平均方向,用于改善间接光照的质量
- 类型 float3
- 范围 [0…1]
- Linear RGB,在切线空间中对方向矢量进行编码
- clearCoatNormal
- 用于扰动crear coat layer曲面细节法线的bump mapping
- 类型 float3
- 范围 [0…1]
- Linear RGB,在切线空间中对方向矢量进行编码
- emissive
- 额外的diffuse albedo,用于模拟自发光物体
- 类型 float4
- 范围
- Linear RGB强度(以尼特(nits)为单位),alpha编码曝光权重
- postLightingColor
- 可与照明计算结果混合的附加颜色,详见postLightingBlending
- 类型 float4
- 范围 [0…1]
- Pre-multiplied linear RGB
- ior
- 折射率,适用于折射物体或作为反射率的替代方案
- 类型 float
- 范围 [1…n]
- 可选,通常由反射率推导出来
- transmission
- 定义有多少绝缘体的漫反射光通过物体,换句话说,就是定义了物体的透明度
- 类型 float
- 范围 [0…1]
- absorption
- 折射物体的吸收因子
- 类型 float
- 范围 [0…n]
- microThickness
- 折射物体thin layer的厚度
- 类型 float
- 范围 [0…n]
- thickness
- 折射物体实心体(solid volume)的厚度
- 类型 float
- 范围 [0…n]
- 注意事项
- Linear RGB
- 有几种材质属性需要提供RGB颜色信息,Filament材质使用的都是线性空间的RGB颜色。因此,必须保证提供的颜色信息在线性空间中。
- pre-multiplied RGB
- Filament的材质使用的颜色是预先乘以alpha通道的
- absorption
- 通过材质的光衰减定义为
e
?
a
b
s
o
r
p
t
i
o
n
?
d
i
s
t
a
n
c
e
e^{-absorption\cdot distance}
e?absorption?distance,距离取决于厚度(thickness )参数
- 如果未提供厚度信息,则直接使用吸收(absorption)参数,通过材质的光衰减变为
1
?
a
b
s
o
r
p
t
i
o
n
1- absorption
1?absorption
- 为了在所需距离下获取某种颜色,上述公式可以进行翻转为
a
b
s
o
r
p
t
i
o
n
=
?
l
n
(
c
o
l
o
r
)
d
i
s
t
a
n
c
e
absorption = -\cfrac{ln(color)}{distance}
absorption=?distanceln(color)?
- ior and reflectance
- 折射率 (IOR) 和反射率(reflectance)表示相同的物理属性,因此不需要同时指定。通常,仅指定反射率,并自动推导IOR。当仅指定了 IOR 时,将自动推导反射率。可以同时指定两个参数,在这种情况下,它们的值保持原样,这可能产生物理上不可能的材质(physically impossible materials),但是,出于艺术原因,这种操作也是可取的。
- thickness and microThickness for refraction
- thickness 表示实体物体在法线方向上的厚度,为了获得令人满意的结果,这应该按fragment(例如:作为纹理)或至少按vertex提供。
- microThickness 表示物体thin layer的厚度,通常可以作为常数值提供。例如,半径为1m的1mm薄空心球体的 thickness 为1,microThickness 为0.001。目前,当折射类型(refractionType )设置为薄时,不使用厚度参数。
Base Color
- baseColor 定义对象的感知颜色(有时也称albedo(反照率))。
- baseColor的效果取决于物体表面的性质(由metallic 属性控制)
- Non-metals (dielectrics)
- 定义物体表面的diffuse color
- 如果编码在0~255之间,则取值范围在[10, 240]
- 如果编码在0~1之间,则取值范围在[0.04, 0.94]
- 非金属的颜色值
- 煤
- sRGB:0.19,0.19,0.19
- #323232
- ██████████
- 橡胶
- sRGB:0.21,0.21,0.21
- #353535
- ██████████
- 泥土
- sRGB:0.33,0.24,0.19
- #553d31
- ██████████
- 木材
- sRGB:0.53, 0.36, 0.24
- #875c3c
- ██████████
- 植物
- sRGB:0.48, 0.51, 0.31
- #7b824e
- ██████████
- 砖
- sRGB:0.58, 0.49, 0.46
- #947d75
- ██████████
- 沙子
- sRGB:0.69, 0.66, 0.52
- #b1a884
- ██████████
- 混凝土
- sRGB:0.75, 0.75, 0.73
- #c0bfbb
- ██████████
- Metals (conductors)
- 定义物体表面的specular color
- 如果编码在0~255之间,则取值范围在[170, 255]
- 如果编码在0~1之间,则取值范围在[0.66, 1.00]
- 金属的颜色值
- 银
- sRGB:0.97, 0.96, 0.91
- #f7f4e8
- ██████████
- 铝
- sRGB:0.91, 0.92, 0.92
- #e8eaea
- ██████████
- 钛
- sRGB:0.76, 0.73, 0.69
- #c1baaf
- ██████████
- 铁
- sRGB:0.77, 0.78, 0.78
- #c4c6c6
- ██████████
- 铂金
- sRGB:0.83, 0.81, 0.78
- #d3cec6
- ██████████
- 金
- sRGB:1.00, 0.85, 0.57
- #ffd891
- ██████████
- 黄铜
- sRGB:0.98, 0.90, 0.59
- #f9e596
- ██████████
- 铜
- sRGB:0.97, 0.74, 0.62
- #f7bc9e
- ██████████
Metallic
- metallic 属性定义物体表面是金属[metallic (conductor)]还是非金属[non-metallic (dielectric)]
- 应该使用二进制0或1表示
- 使用纹理时,中间值仅适用于在不同类型物体表面之间的过渡
- metallic 可以明显改变物体表面的外观。
- 非金属表面具有漫反射和镜面反射(反射光不会改变颜色)
- 金属表面没有任何漫反射,只有镜面反射(反射光使用baseColor)
Roughness
- roughness 控制物体表面的感知平滑度(perceived smoothness)。当粗糙度设置为0时,物体表面完全光滑且具有很高的光泽度。
- 表面越粗糙,反射就越"模糊"。roughness 在其他引擎和工具中通常称为光泽度,并且与粗糙度值相反(roughness = 1 - glossiness)
Reflectance
Sheen color
- Sheen Color 控制 base layer 上,可选 sheen layer 的外观和强度。如果存在 clear coat layer,sheen layer 始终位于clear coat layer的下方
Sheen roughness
- 与 roughness 相同,只不过 sheen roughness 只适用于 sheen layer
Clear coat
- 多层材质(Multi-layer materials)非常常见,特别是在 base layer 上有一层半透明的材质。
- 现实世界中,这类材质有:车漆、易拉罐、木漆、丙烯酸
- clearCoat 属性可以描述两层材质,clear coat layer 必须是各项同性的绝缘体
- clearCoat 控制 clear coat layer 的强度
- 应该为二进制数值,0 或 1
- 中间值控制 clear coat layer 和 base layer之间的过渡效果
- clear coat layer 会使specular 部分计算翻倍。因此如果不需要clear coat layer,则将 clearCoat 设置为0.0
- clear coat layer 必须在 sheen layer 之上
Anisotropy
- 像拉丝金属这样的材质,只能使用各向异性模型进行建模。
- 通过使用 anisotropy 可以使默认为各项同性的材质变为各项异性
- 如果 anisotropy 为正数
- tangent 方向的各项异性
- bitangent 方向的各项异性
- 各项异性材质的着色比标准材质略为耗时,如果不需要各向异性,将 anisotropy 设置为 0.0
Anisotropy direction
- anisotropyDirection 定义着色点的方向,控制 specular 高光的形状。
- 通常从纹理获取的,是一个vec3类型,编码切线空间中曲面的局部方向。
- 由于方向位于切线空间,z 分量应该设置为 0
Ambient occlusion
- ambientOcclusion 定义着色点接收多少环境光照
- 它是一个 per-pixel shadowing factor
- 取值范围 0.0(fully shadowed) 和 1.0(fully lit) 之间
- 只影响 diffuse 间接光照 (image-based lighting)
- 不会影响点光源、定向光、聚光灯等直接光照
- 也不会影响镜面反射光照(specular lighting.)
Normal
- normal 定义曲面在给定点处的法线
- 一般从法线贴图获取。因此,是一个 per-pixel 值
- 法线在切线空间中。因此,+Z朝向曲面外部
- 使用法线会增加材质渲染时的计算成本
Bent normal
- bentNormal 定义着色点的平均遮挡方向,用于提高间接光照的精度
- Bent normal还可以提高 specular ambient occlusion 的质量
Clear coat normal
- clearCoatNormal 定义着色点 clear coat layer 的法线
- 使用 clearCoatNormal 会增加材质渲染时的计算成本
Emissive
- emissive 用于模拟物体表面自发光效果
- float4 类型的值
- 其中rgb表示强度(nit 尼特)
- alpha 表示曝光强度
- 以尼特为单位的intensity可以让自发光物体与光源有相同的作用,用于重建现实世界中的物体表面
- 如果使用EV (or f-stops[光圈系数]) 曝光值。
- 则可以使用自发光颜色乘以 API
filament::Exposure::luminance(ev) 得到 - 该API返回特定EV的亮度(以尼特为单位)
- 也可以使用如下公式进行转换
-
L
=
2
E
V
?
3
L = 2^{EV-3}
L=2EV?3
- Alpha通道中保存的曝光权重可以扰动相机曝光,以此让自发光物体泛光(bloom)
- 当曝光强度为0时,则自发光 intensity 不受相机曝光的影响
- 当曝光强度为1时,intensity 将乘以相机曝光度
Post-lighting color
- postLightingColor 用于在光照计算完成时修改物体表面的颜色
- 该参数没有物理意义,仅用于实现特定效果或用于debug
- 为float4
- post-lighting 的颜色根据postLightingBlending material选项指定的混合模式与光照结果进行混合
- 详情可以参照文档
- postLightingColor 可以当作一个简单的emissive属性使用
- 将 postLightingBlending 设置为add
- 提供一个alpha为0.0的RGB颜色
Index of refraction
-
IOR 仅作用与非金属材质,可以控制材质的折射率和镜面反射强度
- IOR 与折射(透射)材质一起使用
- refractionMode 设置为 cubemap 或 开启 screenspace
- IOR也可以用于非折射物体上,作为反射率使用
-
材质的 IOR (or refractive index) 是一个无量纲数(dimensionless ),描述了光通过材质的速度
- 数值越大,光在介质中传播的速度越慢。
- 对于渲染材质而言,IOR 决定了光线进入材质的路径是如何弯曲的
- 较高的 IOR 将导致光线在远离初始路径的地方弯曲
-
不同材质 IOR 如下表
Material | IOR |
---|
空气 | 1.0 | 水 | 1.33 | 常见液体 | 1.33 ~ 1.5 | 常见宝石 | 1.58 ~ 2.33 | 塑料、玻璃 | 1.5 ~ 1.58 | 其他绝缘体材质 | 1.33 ~ 1.58 |
-
折射材质的外观在很大程度上取决于材质 refractionType 和 refractionMode 的设置 -
IOR 和 reflectance 设置任何一个即可计算出另一个。也可以两个都设置,具体原因在上一节已经叙述 -
折射材质受粗糙度特性的影响
- 粗糙的材质会散射光线,产生散射效果。有助于重现"模糊"的外观,如磨砂玻璃、某些塑料等
Transmission
- transmission 定义了漫射光通过折射材质的透射比率。仅影响refractionMode 设置为 cubemap 或 screenspace 的材质。
- 当 transmission 设置为 0 时,不会透射任何光,并且物体表面的diffuse 部分100%可见。当 transmission 设置为 1 时,所有光都会透射,diffuse 部分不再可见,只有 specular 部分可见。
- transmission 可用于在折射类型材质,如创建贴花、清漆等。
Absorption
- absorption 定义了穿过材质的光的吸收系。
- 通过物体的透射率遵循光学深度 [optical depth](用 microThickness 或 thickness定义)并呈指数级。计算出的颜色遵循以下公式:
-
c
o
l
o
r
?
e
?
a
b
s
o
r
p
t
i
o
n
?
d
i
s
t
a
n
c
e
color \cdot e^{-absorption \cdot distance}
color?e?absorption?distance
- 如果
d
i
s
t
a
n
c
e
distance
distance 是 microThickness 或 thickness,则表示光在给定点穿过材质的距离。如果未指定厚度/距离,则计算出的颜色将改为遵循以下公式:
-
c
o
l
o
r
?
(
1
?
a
b
s
o
r
p
t
i
o
n
)
color \cdot (1 - absorption)
color?(1?absorption)
- 直接设置吸收系数可能不直观,这就是为什么我们建议使用 transmittance color 和 “at distance” 因子。这两个参数允许艺术家指定材质在体的指定距离上具有更精确颜色。absorption 可以这样计算:
-
a
b
s
o
r
p
t
i
o
n
=
l
n
(
t
r
a
n
s
m
i
t
t
a
n
c
e
C
o
l
o
r
)
a
t
D
i
s
t
a
n
c
e
absorption = \cfrac{ln(transmittanceColor)}{atDistance}
absorption=atDistanceln(transmittanceColor)?
- 虽然这种计算可以在材质渲染中完成,但我们建议尽可能离线进行。Filament 为此目的提供了一个API,
Color::absorptionAtDistance(). 。
Micro-thickness and thickness
- microThickness 和 thickness 属性定义了折射物体材质的光学深度。当 refractionType 设置为 thin 时使用 microThickness,当refractionType 设置为 volume 时使用 thickness。
- thickness 表示实心物体在法线方向上的厚度,为了获得令人满意的结果,这应该按 per fragment (如:纹理)或至少按 per vertex 提供。
- microThickness 表示物体 thin layer(壳)的厚度,通常可以作为常量值提供。例如,半径为1m的1mm薄空心球体的 thickness 为 1,microThickness 为 0.001。当前,当 refractionType 设置为 thin 时,不使用 thickness 。这两个属性都可供将来使用。
- thickness 和 microThickness 都用于当 absorption被设置时计算材质的透射颜色。在实心体中,thickness 也会影响光线的折射方式。
Cloth model
- 前面描述的所有材质模型都旨在模拟宏观和微观层面的致密表面。然而,衣服和织物通常由松散连接的线制成,这些线吸收并散射入射光。与硬表面 (hard surfaces) 相比,布料的特点是具有 softer specular lob,具有较大的衰减和模糊光照 (fuzz lighting) 的存在,这是由向前/向后散射引起的。一些面料还呈现出 two-tone specular colors(例如天鹅绒)。
- 注意
- 有些类型的织物仍最好通过硬表面材质模型进行建模。例如,皮革、丝绸和缎子可以使用标准或各向异性材质模型进行实现。
- 布料模型包含先前为标准材质模式定义的所有参数,但 metallic 和 reflectance 除外。两个额外参数如下:
- sheenColor
- 用于创建 two-tone specular 织物的镜面色调(Specular tint)
- 默认为
b
a
s
e
C
o
l
o
r
\sqrt{baseColor}
baseColor
?
- 类型 float3
- 范围 [0…1]
- Linear RGB
- subsurfaceColor
- 穿过材质时散射和吸收后的 diffuse color 的色调
- 类型 float3
- 范围 [0…1]
- Linear RGB
- 要创建类似天鹅绒的材质,base color 可以设置为黑色(或深色)。染色(Chromaticity )信息应改为设置在 sheen color 上。要创建更常见的织物,例如牛仔布,棉质等,请使用 base color 以获得染色信息,并使用默认的sheen color 或将 sheen color 设置为 base color 的亮度。
- 要查看 roughness 参数的效果,请确保 sheenColor 比 baseColor 更亮。这可用于创建模糊效果(fuzz effect)。以 baseColor 的亮度作为 sheenColor 将产生一种相当自然的效果,适用于普通布料。深色 baseColor 与明亮/饱和(bright/saturated)的 sheenColor 相结合,可用于创建天鹅绒。
- 应谨慎使用 “subsurfaceColor” 参数。高值可能会干扰某些区域中的阴影。它最适合光线通过材质时产生细微的透射效果。
Sheen color
- sheenColor 属性可用于直接修改 specular reflectance。它可以更好地控制布料的外观,并赋予创建 two-tone specular 材质的能力。
Subsurface color
- subsurfaceColor 属性不是基于物理的,可用于模拟某些类型织物中光的散射(scattering)、部分吸收(partial absorption)和 再发光(re-emission)。这对于创建更柔软的织物(softer fabrics)特别有用。
Unlit model
Specular glossiness
- 该材质类型是为了兼容老数据,不建议使用。因此,略。
总结
?? 本节主要是整理Filament材质参数的应用与使用原则,与上节有很多相同的地方。但是侧重点偏向于应用而不是算法理解。
|