Appearance
Lit
Lit模式也是引擎的标准光照模型,它是一个基于物理的材质(Physically-Based Rendering,PBR),很多工具和引擎都支持PBR材质,如Unity,UE等。这种材质可以非常方便的表达非金属和金属。下面的表格例举了PBR材质的常见的属性。
属性 | 定义 |
---|---|
baseColor | 描述非金属的漫反射固有色颜色,或者金属表面的高光反射颜色 |
normal | 使用BumpMaping(NormalMaping)来扰动表面的细节的法线。 |
bentNormal | 指向平均不包含方向的法线。可以用来改善间接照明的质量。 |
metallic | 介于0到1之间的一个数值,趋近于0代表非金属,趋近于1代表金属 |
roughness | 介于0到1之间的一个数值,0代表粗糙,1代表光滑,越光滑则其镜面反射越强 |
reflectance | 非金属表面正入射时的反射值,可推导菲涅耳反射率。这直接控制了反射的强度 |
ior | 折射率,非金属表面的折射率,这个值与reflectance强相关 |
transmission | 定义了有多少非金属的漫射光通过物体传播,换句话说,它定义了物体的透明度 |
absorption | 折射率物体的吸收系数 |
microThickness | 折射率物体的薄层厚度 |
thickness | 折射物体的固体体积的厚度 |
clearCoat | 清漆层的强度 |
clearCoatRoughness | 清漆层的粗糙度 |
clearCoatNormal | 使用BumpMaping(NormalMaping)来扰动清漆表面的细节的法线。 |
sheenColor | 光泽层的颜色 |
sheenRoughness | 光泽层的粗糙度 |
anisotropy | 在切线方向或者次切线方向上的各项异性值 |
anisotropyDirection | 在切线空间的各向异性方向 |
ambientOcclusion | 定义一个表面点可以接触到多少环境光。它是一个介于0.0和1.0之间的每像素阴影因子 |
emissive | 额外的漫射反照率来模拟发射表面(如霓虹灯等),这个属性在带有bloom通道的HDR管道中非常有用 |
postLightingColor | 额外的颜色,可以与照明计算的结果混合 |
!!! Note: 关于ior和reflectance 折射率(IOR)和反射率(reflectance)表示相同的物理属性,因此不需要同时指定它们。通常,只指定反射率,然后自动推导折射率。如果只指定折射率,则自动推导反射率。可以同时指定两者,在这种情况下,它们的值保持原样,这可能导致物理上不可能的材料,但是,出于艺术原因,这可能是可取的。
!!! Note: 关于thickness和microThickness 厚度(thickness)表示实体物体在法线方向上的厚度,为了获得满意的结果,应该提供每个片段(例如:作为纹理)或至少每个顶点。微厚度(microThickness)表示物体薄层的厚度,通常可以提供一个恒定值。例如,一个半径为1m的1mm薄空心球体,其厚度为1,微厚度为0.001。目前,当材质定义中的refractionType设置为thin时,thickness属性不再生效。
!!! Note: 关于absorption 通过材料的光衰减定义为$e^{-absorption \cdot distance}$,距离取决于thickness参数。如果未提供thickness,则absorption参数直接使用,光通过材料衰减变成$1-absorption$。在所需的距离上获得一定的颜色方程可以倒置为$absorption = -\frac{ln(color)}{distance}$。
BaseColor参数
baseColor属性定义对象的感知颜色(有时称为反照率,或固有色)。baseColor的效果取决于表面的性质,也被metallic参数控制,metallic参数在后文有详细的解释。下面是非金属与金属的baseColor的直观感受。
- 非金属(也叫电介质) 定义物体表面的漫反射颜色。在真实世界中其值域范围通常是10到240(如果颜色范围是0到255),或者是0.04到0.94(如果颜色范围是0到1),下面的表格是一些非金属表面的baseColor。
Metal | sRGB | Hexadecimal | Color |
---|---|---|---|
Coal | 0.19, 0.19, 0.19 | #323232 | |
Rubber | 0.21, 0.21, 0.21 | #353535 | |
Mud | 0.33, 0.24, 0.19 | #553d31 | |
Wood | 0.53, 0.36, 0.24 | #875c3c | |
Vegetation | 0.48, 0.51, 0.31 | #7b824e | |
Brick | 0.58, 0.49, 0.46 | #947d75 | |
Sand | 0.69, 0.66, 0.52 | #b1a884 | |
Concrete | 0.75, 0.75, 0.73 | #c0bfbb |
- 金属(也叫导体) 定义物体表面的镜面反射颜色。在真实世界中其值域范围通常是170到255(如果颜色范围是0到255),或者是0.66到1.0(如果颜色范围是0到1),下面的表格是一些金属表面的baseColor。
Metal | sRGB | Hexadecimal | Color |
---|---|---|---|
Silver | 0.97, 0.96, 0.91 | #f7f4e8 | |
Aluminum | 0.91, 0.92, 0.92 | #e8eaea | |
Titanium | 0.76, 0.73, 0.69 | #c1baaf | |
Iron | 0.77, 0.78, 0.78 | #c4c6c6 | |
Platinum | 0.83, 0.81, 0.78 | #d3cec6 | |
Gold | 1.00, 0.85, 0.57 | #ffd891 | |
Brass | 0.98, 0.90, 0.59 | #f9e596 | |
Copper | 0.97, 0.74, 0.62 | #f7bc9e |
Normal参数
法线属性定义了曲面在给定点处的法线。它通常来自于法线贴图纹理,它允许改变每像素的属性。法线是在切空间中提供的,这意味着+Z点在表面之外。
例如,假设我们想要渲染一件覆盖着簇绒皮革的家具。建模几何来准确地表示簇状图案将需要太多的三角形,所以我们将一个高多边形网格烘烤成法线贴图。一旦将基础图应用于简化的网格,我们将得到如图所示的结果。
BentNormal参数
bentNormal属性定义了曲面上一点的平均未遮蔽方向。它被用来提高间接照明的精度。bentNormal也可以提高镜面环境遮挡的质量。
bentNormal可以大大提高具有各种空腔和凹区的资产的视觉保真度,如图所示。例如,看看耳朵、鼻孔和眼睛的区域。
Metallic参数
metallic属性定义了表面是金属(导体)还是非金属(电介质)表面。此属性应作为二进制值使用,设置为0或1。中间值只有在创建不同类型表面之间的过渡时才真正有用,如当使用纹理时。
这个属性可以极大地改变表面的外观。非金属表面有漫反射和镜面反射(反射光不会改变颜色);金属表面没有漫反射,仅有镜面反射(反射光会根据baseColor的定义来改变其颜色)。
下面是一个物体金属度从0到1的变化。
Roughness参数
roughness属性控制表面的感知平滑度。当粗糙度设置为0时,表面非常光滑,具有很高的光泽。表面越粗糙,反射越“模糊”。这个属性在其他引擎和工具中通常被称为光泽度(glossiness),与粗糙度相反(roughness = 1 - glossiness)。
非金属的粗糙度从0到1表现如下 金属的粗糙度从0到1表现如下
Reflectance参数
reflectance属性只影响非金属表面。这个特性可以用来控制材料的镜面强度和折射率。该值定义在0到1之间,表示了对菲涅尔反射率的重新映射。例如,默认值0.5对应于4%的反射率。应避免低于0.35(2%反射率)的值,因为现实世界中没有任何材料具有如此低的反射率。
非金属表面反射从0到1的表现如下
从reflectance参数到菲涅尔反射率的映射关系,如下
下表描述了可以接受的不同材料的reflectance的属性值,注意现实世界没有反射率低于2%的,所以尽量不要把reflectance属性设置到0.35以下。
材料名称 | 菲涅尔反射率 | 折射率(ior) | 反射值(reflectance) |
---|---|---|---|
Water | 2% | 1.33 | 0.35 |
Fabric | 4% to 5.6% | 1.5 to 1.62 | 0.5 to 0.59 |
Common liquids | 2% to 4% | 1.33 to 1.5 | 0.35 to 0.5 |
Common gemstones | 5% to 16% | 1.58 to 2.33 | 0.56 to 1.0 |
Plastics, glass | 4% to 5% | 1.5 to 1.58 | 0.5 to 0.56 |
Other dielectric materials | 2% to 5% | 1.33 to 1.58 | 0.35 to 0.56 |
Eyes | 2.5% | 1.38 | 0.39 |
Skin | 2.8% | 1.4 | 0.42 |
Hair | 4.6% | 1.55 | 0.54 |
Teeth | 5.8% | 1.63 | 0.6 |
Default value | 4% | 1.5 | 0.5 |
reflectance被定义为0到1之间的一个归一化的值是可取的,因为非常方便使用纹理来进行表达。
!!! Note: 关于ior和reflectance 折射率(IOR)和反射率(reflectance)表示相同的物理属性,因此不需要同时指定它们。通常,只指定反射率,然后自动推导折射率。如果只指定折射率,则自动推导反射率。可以同时指定两者,在这种情况下,它们的值保持原样,这可能导致物理上不可能的材料,但是,出于艺术原因,这可能是可取的。
ior参数
ior属性只影响非金属表面。此属性可用于控制材质的折射率和材料的镜面强度。ior属性的本意是与具有折射(或透射)材料使用,即当材质定义中的refractionMode设置为cubemap或screenspace时。但它也可以用于非折射物体,作为reflectance属性的一个替代。
材质的ior属性是一个无量纲的数字,它描述光穿过这种物质的速度。数字越大,光传播越慢通过媒介。更重要的是,对于渲染材料,折射率决定了光在进入材料时所走的路径是如何弯曲的。较高的折射率会引起光从最初的路径弯曲得更远。
下表展示了不同材料的可接受的IOR值
Material | IOR |
---|---|
Air | 1.0 |
Water | 1.33 |
Common liquids | 1.33 to 1.5 |
Common gemstones | 1.58 to 2.33 |
Plastics, glass | 1.5 to 1.58 |
Other dielectric materials | 1.33 to 1.58 |
材质的折射取决于材质定义中的refractionType和refractionMode的设置。
- refractionMode设置为cubemap,refractionType设置为solid时,ior从1到1.5的表现如下:
- refractionMode设置为screenspace,refractionType设置为solid时,ior从1.0和1.33的表现如下:
!!! Note: 关于ior和roughness 折射率材料受其粗糙度的影响。粗糙的材料会散射光线,产生一种扩散效果,有助于重建“模糊”的外观,如磨砂玻璃,某些塑料等。
Transmission参数
transmission属性定义了通过折射率材料的漫射光的透射率。这个属性只影响在材质定义中的refactionmode设置为cubemap或screenspace的材质。
当透射率设置为0时,没有光被透射,表面的漫反射成分是100%可见的。当传输设置为1时,所有的光都被传输,漫射的光照分量不再可见,只有镜面的光照分量可见。
下图展示了一个有一定光泽度的非金属在透射光线时的表现(ior=1,refractionMode=cubemap,refractionType=solid)
!!! Note: transmission属性对于在具有折射的材质表面上创建贴花、油漆等非常有用。
Absorption参数
absorption属性决定了通过材料的光的吸收系数。下图展示ior为1.5,基色为白色的物体上的表现效果
通过体积的透光率与光学深度(用微厚度或厚度定义)呈指数关系。计算出的颜色遵循以下公式: $$color \cdot e^{-absorption \cdot distance}$$
这里的距离要么是微厚度,要么是厚度,即光在某一点穿过材料的距离。如果未指定厚度/距离,则计算颜色 下面是这个公式: $$color \cdot (1 - absorption)$$
下图展示ior为1.3, thickness为4.5时,absorption从 (0.0, 0.02, 0.14)到 (0.0, 0.36, 2.3)的变化呈现
Micro-thickness与thickness
microThickness和thickness属性定义了折射物体材质的光学深度。当材质定义中的refractionType设置为thin时使用microThickness,当材质定义中的refractionType设置为volume时使用thickness。
thickness表示实体物体在法线方向上的厚度,为了获得满意的结果,应该提供每个片段(例如:作为纹理)或至少每个顶点。
microThickness表示物体的薄层(外壳)的厚度,一般可以提供一个常数值。例如,一个半径为1m的1mm薄空心球体,其厚度为1,微厚度为0.001。目前,当refractionType设置为thin时,不使用厚度。
当absorption属性被设定时,microThickness和thickness都被用来计算材料的透射颜色。在材质定义中的refractionType设置为solid时,厚度也会影响光线的折射。
当材质定义中的refractionMode设置为screenSpace时,如下所示。请注意,厚度值不仅改变了吸收效果,而且改变了折射光的方向。
下图暂时了一个金字塔形状的透射物体,顶部thickness为0,底部thickness为3,材质定义中的refractionType设置为solid时的变化情况
clearCoat的相关参数
多层材料是相当常见的,特别是在基础层上有一层薄薄的半透明层的材料。这种材料在现实世界中的例子包括汽车油漆、汽水罐、漆木和丙烯酸。
clearCoat就是用于描述具有两层的材料,透明图层始终时各向同性,并且是非金属(具有介电性)的。下图展示了碳纤维的材质在标准材质(只有基础层)和添加了clearCoat层的表现。
clearCoat的参数一共有三个:
- clearCoat:用于表达清漆层的强度,他本身应该是非0即1的,但位于0到1之间的值也可以用来进行有清漆和无清漆之间的过度,下图展示clearCoat从0到1的变化
- clearCoatRoughness:类似于基础层的粗糙度,但该属性仅应用于clearCoat层,下图展示了其从0到1变化
- clearCoatNormal: 清漆层的法线,清漆层主要是计算镜面反射而不是漫反射,所以增加法线的扰动,可以让整体更带感。
!!!Note: clearCoat会将镜面反射的计算量提高一倍,即不仅计算了基础层还计算了清漆层,算了两次,所以一些对性能有特别要求的场景也应该尽量规避使用。在实际项目中,我听说有的项目使用了叠加了6层的材质,虽然不清楚具体的应用场景,但是我个人觉得是恐怖的。
Sheen的相关参数
sheen代表光泽层,他位于基础层之上,如果有clearCoat层,那么位于clearCoat层之下,往往用来表达布料和织物材料。Sheen相关的参数有两个
- sheenColor:表达光泽层的颜色和强度。下图展示了不同的sheenColor效果。
- sheenRoughness: 类似于基础层的Roughness,但只是应用在sheen层。下图展示了基础层为深蓝色,metallic为0,粗糙度为1,sheenRoughness从0到1的变化情况。
!!!Note: 在实际使用中,在表达布料或者织物中,往往不需要其他参数参数的,比如金属或者粗糙度(织物的特性决定)等,所以往往会将sheen单独的封装一个材质,这部分可以根据项目的实际情况来进行把控。
Anisotropy的相关参数
Anisotropy控制物体的各项异性。各向异性顾名思义,物体从不同的方向上看过去,表达出了不同的材料性质,把具有这种特性的材质叫做各向异性材质。比如红太狼的平底锅的锅底,本身是金属,应该和一个铁板表面差不多,但是因为有一圈一圈的纹路用于更好的加热,所以在光照的作用下呈现出不同的性质,但它还是由相同的材料做成的。相同的例子还有拉丝金属、头发(金发大波浪)等等。下图是一个各项同性和各向异性的对比。
各项异形的参数有:
- anisotropy,各向异性的控制。下图展示了一个粗糙金属球,其各向异性从0到1的变化 anisotropy也可以为负值,它控制了各向异性的高光方向,为正值是在切线方向上产生高光,为负值时在半切向方向上产生高光,如图
- anisotropyDirection: 定义了给定点表面的方向,从而控制镜面高光的形状。它被指定为3个值的向量,通常来自纹理,编码切线空间中表面的局部方向。因为方向在切空间中,所以Z分量应该设为0。
!!!Note: 各向异性实际上对光照分量中的镜面反射分量进行再次的影响,也就是说它时作用于基础层的高光之上,性能上稍微有一些损耗,所以如果在不需要表达这种材质特性的时候,也不要设置该值。
AmbientOcclusion参数
环境阴影遮蔽是物体于物体之间,因为位置摆放,接触面于接触面之间产生的阴影的一种表达。与光线追踪的算法不同,在光栅化的过程中一个三角面的渲染并不能感知除自己之外的其他三角面与自己的关系,所以并不会产生因周围环境的不同而产生的阴影变化。而该参数正是为了解决这一问题。以下展示了无环境遮蔽(左)和有环境遮蔽(右)的区别。
ambientOcclusion属性定义了多少环境光可以到达一个表面点。它是一个在0.0(完全阴影)和1.0(完全照亮)之间的每像素阴影因子。此属性仅影响漫射间接照明(基于图像的照明),不影响定向、点和聚光灯等直接照明,也不影响镜面照明。
在引擎效果中,还会有一个屏幕空间的AO,二者的区别是:
- 材质中的AO参数往往会用一个纹理来表达,表达的是该模型本身,三角面与三角面的相互遮蔽关系
- 屏幕空间AO(SSAO)是表达场景中不同的物体摆放,即场景中的不同的物体之间的物体上的三角面的相互遮蔽关系
- 当二者同时存在时,取二者中的最小值。
Emissive参数
Emissive是自发光特性,在光栅效果中,往往与bloom效果配合。表达的现实生活中的物体如霓虹灯等,相对环境很亮的物体。自发光不是光源,在光栅中它不会照亮其他物体,仅仅是自己特别亮,然后配合bloom等形成泛光。
它被定义为一个float4值,其中包含以单位为单位的RGB强度以及曝光权重(在alpha通道中)。在alpha通道中携带的曝光重量可以用来撤销相机曝光,从而迫使表面仅应用Emissive。曝光权重设置为0时,发射强度不受相机曝光的影响。当重量设置为1时,强度乘以相机曝光。
Post-lighting color
postLightingColor可以用来修改光照计算后的表面颜色。此属性没有物理意义,仅用于实现特定效果或帮助调试。该属性被定义为float4值,其中包含线性空间中预乘的RGB颜色。该属性破坏了材质的PBR法则(不遵循能量守恒等),实际中很少用到,仅仅是最终颜色的修正或者补充。
根据postLightingBlending材质选项指定的混合模式,将后期照明颜色与照明结果混合。