Google Filament 源码学习(三):Material System (二)

目录

  • Filament Materials Guide
    • Introduction
    • 相关术语与概念
  • Material Models
    • Lit Model
      • Base Color
      • Metallic
      • Roughness
      • Reflectance
      • Sheen color
      • Sheen roughness
      • Clear coat
      • Anisotropy
      • Anisotropy direction
      • Ambient occlusion
      • Normal
      • Bent normal
      • Clear coat normal
      • Emissive
      • Post-lighting color
      • Index of refraction
      • Transmission
      • Absorption
      • Micro-thickness and thickness
    • Cloth model
      • Sheen color
      • Subsurface color
    • Unlit model
    • Specular glossiness
  • 总结

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
        • 范围
          • rbg [0…n]
          • a [0…1]
        • 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} eabsorptiondistance,距离取决于厚度(thickness )参数
        • 如果未提供厚度信息,则直接使用吸收(absorption)参数,通过材质的光衰减变为 1 − a b s o r p t i o n 1- absorption 1absorption
        • 为了在所需距离下获取某种颜色,上述公式可以进行翻转为 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

  • reflectance 属性仅影响非金属表面。该属性可用于控制材质的镜面反射强度和折射率。取值在 0 到 1 之间,表示反射率百分比的remapping 。例如,默认值 0.5 对应于 4% 的反射率。应避免该值低于0.35(2%反射率),因为真实材质中没有如此低的反射率。

  • 常用材质的 reflectance 如下

    aterial Reflectance IOR Linear value
    2% 1.33 0.35
    织物 4% ~ 5.6% 1.5 ~ 1.62 0.5 ~ 0.59
    常见液体 2% ~ 4% 1.33 ~ 1.5 0.35 ~ 0.5
    常见宝石 5% ~ 16% 1.58 ~ 2.33 0.56 ~ 1.0
    塑料、玻璃 4% ~ 5% 1.5 ~ 1.58 0.5 ~ 0.56
    其他绝缘体材质 2% ~ 5% 1.33 ~ 1.58 0.35 ~ 0.56
    眼睛 2.5% 1.38 0.39
    皮肤 2.8% 1.4 0.42
    毛发 4.6% 1.55 0.54
    牙齿 5.8% 1.63 0.6
    默认值 4% 1.5 0.5
  • 注意

    • 定义reflectance 时,不必定义 ior。
    • 设置了这两个参数的任意一个时,将自动计算另一个的值。
    • 也可以两个都设置,在这种情况下,它们的值保持原样,这可能导致物理上不可能的材质(上一节已经阐述过了,这里注意一下就行)
  • reflectance 是归一化的值,范围在[0…1]。因此,很容易使用纹理保存

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 的法线
    • 与normal不同
  • 使用 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=2EV3
  • Alpha通道中保存的曝光权重可以扰动相机曝光,以此让自发光物体泛光(bloom)
    • 当曝光强度为0时,则自发光 intensity 不受相机曝光的影响
    • 当曝光强度为1时,intensity 将乘以相机曝光度

Post-lighting color

  • postLightingColor 用于在光照计算完成时修改物体表面的颜色
    • 该参数没有物理意义,仅用于实现特定效果或用于debug
    • 为float4
      • 为预乘Alpha的线性RGB值
    • 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} coloreabsorptiondistance
    • 如果 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(1absorption)
  • 直接设置吸收系数可能不直观,这就是为什么我们建议使用 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

  • Unlit model 可用于关闭所有照明计算。其主要目的是渲染预光照(pre-lit)元素,如立方体贴图,外部内容(如视频或摄像机流),用户界面,可视化/调试等。unlit model 仅暴露如下属性。

    Property Definition Type Range Not
    baseColor 物体表面漫反射颜色 float4 [0…1] Pre-multiplied linear RGB
    emissive 用于模拟自发光表面的附加漫反射颜色。此属性在bloom pass 的 HDR 管线中最有用 float4 rgb = [0…n], a=[0, 1] 线性RGB intensity(以尼特为单位),alpha编码曝光权重
    postLightingColor 可与baseColor 和 emissive 混合的额外颜色 float4 [0…1] Pre-multiplied linear RGB
  • postLightingColor 的值根据 postLightingBlending 材质选项指定的混合模式与 emissive 和 baseColor 之和进行混合。

Specular glossiness

  • 该材质类型是为了兼容老数据,不建议使用。因此,略。

总结

   本节主要是整理Filament材质参数的应用与使用原则,与上节有很多相同的地方。但是侧重点偏向于应用而不是算法理解。

你可能感兴趣的:(Filament,c++,渲染引擎,学习)