Appearance
Material部分
Material部分是一个材质定义必须的部分,它包含一个属性对列表来描述所有非着色器数据。
通用化参数
- name: string类型,任意字符串,如果包含空格可以使用引号。设置材质的名称,往往用于运行时的调试。
material {
name : stone
}
material {
name : "Wet pavement"
}
- featureLevel: int类型,只为1,2或3,默认是1。设置材质的特征级别。每个特征级别定义了一组材料可以使用的特征。如果材料使用了所选级别不支持的特性,则matc将在编译期间生成错误。给定的功能级别保证支持较低功能级别的所有功能。
Feature Level | Guaranteed features |
---|---|
1 | 9 textures per material |
2 | 9 textures per material, cubemap arrays, ESSL 3.10 |
3 | 12 textures per material, cubemap arrays, ESSL 3.10 |
material {
featureLevel : 2
}
- shadingModel: 字符串类型,值为lit, subsurface, cloth, unlit, specularGlossiness,默认为lit。是材质模型的定义,具体参考这里
material {
shadingModel : unlit
}
- parameters: 类型是一个对象列表,每个条目都是一个对象,具有字符串类型的属性name和type。名称必须是有效的GLSL标识符。条目也有一个可选的精度,它可以是默认的(平台的最佳精度,通常是桌面高,移动中等),低,中,高。在运行时通过材质实例将渲染对象的实际材质参数值设置进去,在shader中通过一定的方式来进行访问,具体来说:
- 采样器类型: 使用materialParams_开头,例如materialParams_myTexture
- 其他类型: 使用materialParams.,例如materialParams.myColor
Type | Description |
---|---|
bool | Single boolean |
bool2 | Vector of 2 booleans |
bool3 | Vector of 3 booleans |
bool4 | Vector of 4 booleans |
float | Single float |
float2 | Vector of 2 floats |
float3 | Vector of 3 floats |
float4 | Vector of 4 floats |
int | Single integer |
int2 | Vector of 2 integers |
int3 | Vector of 3 integers |
int4 | Vector of 4 integers |
uint | Single unsigned integer |
uint2 | Vector of 2 unsigned integers |
uint3 | Vector of 3 unsigned integers |
uint4 | Vector of 4 unsigned integers |
float3x3 | Matrix of 3x3 floats |
float4x4 | Matrix of 4x4 floats |
sampler2d | 2D texture |
sampler2dArray | Array of 2D textures |
samplerExternal | External texture (platform-specific) |
samplerCubemap | Cubemap texture |
示例如下:
material {
parameters : [
{
type : float4,
name : albedo
},
{
type : sampler2d,
format : float,
precision : high,
name : roughness
},
{
type : float2,
name : metallicReflectance
}
],
requires : [
uv0
],
shadingModel : lit,
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
material.baseColor = materialParams.albedo;
material.roughness = texture(materialParams_roughness, getUV0());
material.metallic = materialParams.metallicReflectance.x;
material.reflectance = materialParams.metallicReflectance.y;
}
}
!!! Note: - 采样器类型还可以指定纹理格式,如int或者float - 数组类型需要在类型后面添加size参数,如float[9]
- constants: 常量对象的数组,每个条目都是一个对象,具有字符串类型的属性name和type。名称必须是有效的GLSL标识符。条目也有一个可选的默认值,它可以是bool或数字,具体取决于常量的类型。类型必须是下表中的值。
Type | Description | Default |
---|---|---|
int | A signed, 32 bit GLSL int | 0 |
float | A single-precision GLSL float | 0.0 |
bool | A GLSL bool | false |
列出材质中可接受的常数参数。这些常量可以在加载材料包时设置或“特化”。多个材料可以从相同的材料包加载不同的常数参数特化。一旦材料从材料包中加载,其常量参数就不能更改。与常规参数相比,常量参数允许编译器生成更高效的代码。通过在shader的名字前加上materialConstant_来访问常量参数。例如,一个名为myConstant的常量参数在着色器中被访问为materialConstant_myConstant。如果在运行时未设置常量参数,则使用默认值。
material {
constants : [
{
name : overrideAlpha,
type : bool
},
{
name : customAlpha,
type : float,
default : 0.5
}
],
shadingModel : lit,
blending : transparent,
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
if (materialConstants_overrideAlpha) {
material.baseColor.a = materialConstants_customAlpha;
material.baseColor.rgb *= material.baseColor.a;
}
}
}
- variantFilter: 类型是字符串数据。变体过滤,用于减少编译产物的大小,用于指定应用程序保证永远不需要的着色器变体列表。这些着色器变量在代码生成阶段被跳过,从而减少了材料的整体尺寸。请注意,有些变体可能会自动被过滤掉。例如,所有照明相关的变量(directionalllighting等)在编译unlit材质时被过滤掉。谨慎使用变量过滤器,在运行时过滤掉所需的变量可能会导致崩溃。一些可能的值是:
- directionalLighting, 方向光是否开启的变体
- dynamicLighting, 动态光源(除方向光以外的其他光源)是否开启的变体
- shadowReceiver, 是否接收阴影
- skinning, 是否有骨骼动画
- fog, 是否使用雾效
- vsm, 是否使用协方差阴影
- ssr, 是否使用屏幕空间反射
- ...., 不断扩充中
material {
name : "Invisible shadow plane",
shadingModel : unlit,
shadowMultiplier : true,
blending : transparent,
variantFilter : [ skinning ]
}
- flipUV: 布尔类型,默认是true。当设置为true(默认值)时,当材质的顶点着色器读取UV属性的Y坐标时会翻转。翻转相当于y = 1.0 - y。当设置为false时,翻转被禁用,并按原样读取UV属性。
material {
flipUV : false
}
- quailty:string类型,值为low, normal, high, default其中之一,默认为default。设置材料的一些全局质量参数。Low允许稍微影响正确性的优化,并且是移动平台上的默认值。Normal不影响正确性,在其他方面类似于low。High启用可能对性能产生不利影响的质量设置,并且是桌面平台上的默认设置。
material {
quality : default
}
顶点属性参数
- requires:类型是string列表,列表中的每个元素的值是uv0, uv1, color, position, tangents, custom0~custom7其中之一。列出材质所需的顶点属性。position属性总是必需的,不需要指定。当选择任何非非照明的着色模型时,tangents属性是自动需要的。
material {
parameters : [
{
type : sampler2d,
name : texture
},
],
requires : [
uv0,
custom0
],
shadingModel : lit,
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
material.baseColor = texture(materialParams_texture, getUV0());
material.baseColor.rgb *= getCustom0().rgb;
}
}
- variables: 类型是string列表,最多定义4个变量,且变量的命名符合glsl约定的形式。定义由材质的顶点着色器输出的自定义插值(或变量)。数组的每一项都定义了一个插值器的名称。片段着色器中的全名是带有variable_前缀的插值器的名称。例如,如果你声明一个名为eyeDirection的变量,你可以使用variable_eyeDirection在片段着色器中访问它。在顶点着色器中,插值名称只是MaterialVertexInputs结构(material)的一个成员。eyeDirection(在你的例子中)。每个插值在着色器中都是float4 (vec4)类型。
material {
name : Skybox,
parameters : [
{
type : samplerCubemap,
name : skybox
}
],
variables : [
eyeDirection
],
vertexDomain : device,
depthWrite : false,
shadingModel : unlit
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
float3 sky = texture(materialParams_skybox, variable_eyeDirection.xyz).rgb;
material.baseColor = vec4(sky, 1.0);
}
}
vertex {
void materialVertex(inout MaterialVertexInputs material) {
float3 p = getPosition().xyz;
float3 u = mulMat4x4Float3(getViewFromClipMatrix(), p).xyz;
material.eyeDirection.xyz = mulMat3x3Float3(getWorldFromViewMatrix(), u);
}
}
- vertexDomain: string类型,可选的值是: object, world, view, device,默认是object。定义渲染网格的域(或坐标空间)。域影响顶点着色器中顶点的转换方式。可能的域有:
- object: 顶点在对象(或模型)坐标空间中定义。顶点使用渲染对象的变换矩阵进行变换
- world: 顶点在世界坐标空间中定义。顶点不使用渲染对象的变换进行转换。
- view: 顶点在视图(或眼睛或相机)坐标空间中定义。顶点不使用渲染对象的变换进行转换。
- device: 顶点在标准化的设备(或剪辑)坐标空间中定义。顶点不使用渲染对象的变换进行转换。
material {
vertexDomain : device
}
- interpolation: string类型,可能的值是smooth, flat,默认smooth。定义如何在顶点之间插入插值(或变量)。当此属性设置为smooth时,将对每个插值执行透视正确的插值。当设置为平面时,不执行插值,并且给定三角形内的所有片段将被相同的阴影。
material {
interpolation : flat
}
混合与透明
blending: string类型,可能的值是opaque, transparent, fade, add, masked, multiply, screen,默认是opaque。定义渲染对象如何/是否与渲染目标的内容混合。可能的混合模式有:
- opaque:混合是禁用的,材料的输出的alpha通道被忽略。
- transparent:混合是启用的。材料的输出是与渲染目标的alpha复合,使用波特-达夫的源覆盖规则。这种混合模式假设预乘alpha。
- fade:作为透明但透明度也适用于镜面照明。在透明模式下,材料的alpha值只适用于漫反射照明。这种混合模式对于淡入淡出点亮的物体很有用。
- add:混合是启用的。材料的输出被添加到渲染目标的内容。
- masked:混合是启用的。材料的输出与渲染目标的内容相乘,使内容变暗。
- screen:混合是启用的。有效地与乘法相反,渲染目标的内容被加亮。
- masked:混合是禁用的。这种混合模式启用alpha掩蔽。材料的输出的alpha通道定义是否丢弃一个片段。此外,ALPHA_TO_COVERAGE为非透明视图启用。参见 maskThreshold 部分以获取更多信息。
material {
blending : transparent
}
postLightingBlending: string类型,可能的值为opaque, transparent, add,默认为opaque。定义如何将postLightingColor材质属性与光照计算结果混合。可能的混合模式有:
- Opaque: 混合被禁用,材质将直接输出postLightingColor。
- Transparent: 启用混合。材质的计算颜色是与postLightingColor合成的alpha,使用Porter-Duff的source over规则。这种混合模式假定预先乘以alpha。
- Add: 启用混合。材质的计算颜色被添加到postLightingColor。
- Multiply: 启用混合。材质的计算颜色乘以postLightingColor。
- Screen: 启用混合。材质的计算颜色被反转并与postLightingColor相乘,结果被添加到材质的计算颜色中。
material {
postLightingBlending : add
}
- transparency: string类型,可能的值为default, twoPassesOneSide以及twoPassesTwoSides,默认的值为default。控制透明对象的呈现方式。它仅在混合模式不是Opaque且refractionMode为none时有效。这些方法都不能准确地呈现凹形几何,但在实践中它们往往足够好。三种可能的透明度模式是:
- default: 透明对象正常呈现,遵循剔除模式,等等。
- twoPassesOneSide: 透明对象首先在深度缓冲区中渲染,然后再在颜色缓冲区中渲染,遵循剔除模式。这实际上只呈现了透明对象的一半。
- twopassstwosides: 透明对象在颜色缓冲区中渲染两次:第一次渲染背面,然后渲染正面。该模式允许呈现两组面,同时减少或消除排序问题。twopassstwosides可以与doublesides结合使用,效果更好。
material {
transparency : twoPassesOneSide
}
- maskThreshold: number类型,值介于0到1之间,默认的值为0.4。设置最小alpha值,当混合模式设置为遮罩时,片段必须不被丢弃。如果片段没有被丢弃,则其源alpha被设置为1。当混合模式未被屏蔽时,此值将被忽略。此值可用于控制alpha遮罩对象的外观。
material {
blending : masked,
maskThreshold : 0.5
}
- refractionMode: string类型,可能的值为none, cubemap, screenspace,默认为none。当设置为非none时激活折射。cubemap的值将只使用IBL cubemap作为折射源,而这是非常有效的,没有场景对象将被折射,只有在cubemap中编码的远处环境。这种模式对于对象查看器来说是足够的。屏幕空间的值将采用更先进的屏幕空间折射算法,该算法允许场景中不透明的物体被折射。在立方体映射模式中,假定折射光线从物体的中心发出,厚度参数仅用于计算吸收,而对折射本身没有影响。在屏幕空间模式下,假定折射光线在离开折射介质时平行于观看方向。
material {
refractionMode : cubemap
}
- refractionType: string类型,可能的值为solid, thin,默认为solid。这只有在refractionMode设置为非none时才有意义。refractionType定义使用的折射模型。Solid用于厚的物体,如水晶球、冰块或雕塑。Thin用于薄的物体,如窗户、装饰球或肥皂泡。在实体模式下,假定所有的折射物体都是与入射点相切且半径厚度的球体。在薄模式下,所有的折射率物体都被假定为平面的、薄的、厚度的。
material {
refractionMode : cubemap,
refractionType : thin,
}
光栅化
- culling: string类型,可能的值是none, front, back, frontAndBack,默认的值是back。定义应该剔除哪些三角形:不剔除、正面三角形、背面三角形或全部剔除。
material {
culling : none,
}
- colorWrite: 布尔类型,默认是true。控制是否将颜色写入颜色缓冲区。
material {
colorWrite : false,
}
- depthWrite:布尔类型,对于非透明材质默认是true,对于透明材质默认是false。用于控制是否将深度信息写入深度缓冲区。
material {
depthWrite : false
}
- depthCulling: 布尔类型,默认是true。是否开启深度测试。当深度测试被禁用时,用此材质渲染的对象将始终出现在其他不透明对象的顶部。
material {
depthCulling : false
}
- doubleSided: 布尔类型,默认是false。启用双面呈现,并在运行时切换其功能。当设置为true时,剔除自动设置为none; 如果三角形是面向背面的,则三角形的法线将翻转为面向正面。当显式设置为false时,这允许在运行时切换双面性。
material {
name : "Double sided material",
shadingModel : lit,
doubleSided : true
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
material.baseColor = materialParams.albedo;
}
}
- alphaToCoverage: 布尔类型,默认是false。启用或禁用alpha覆盖。当覆盖的alpha被启用时,片段的覆盖是从它的alpha派生出来的。此属性仅在启用MSAA时才有意义。注意:将混合设置为遮罩会自动启用alpha覆盖。如果您不希望这样做,您可以通过将alpha的覆盖率设置为false来覆盖此行为。
material {
name : "Alpha to coverage",
shadingModel : lit,
blending : masked,
alphaToCoverage : false
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
material.baseColor = materialParams.albedo;
}
}
光照
- reflections: string类型,可能的值为default或screenspace,默认为default。控制材质的镜面反射方式。当此属性设置为默认值时,反射仅来自基于图像的光。当此属性设置为屏幕空间时,除了基于图像的光线之外,反射还来自屏幕空间的颜色缓冲区。
material {
name : "Glossy metal",
reflections : screenspace
}
- shadowMultiplier: 布尔类型,默认为false。仅在未光照的阴影模型中可用。如果启用此属性,则由材质计算的最终颜色乘以阴影因子(或可见性)。这允许创建透明的阴影接收对象(例如AR中不可见的地平面)。这只支持来自定向光的阴影。
material {
name : "Invisible shadow plane",
shadingModel : unlit,
shadowMultiplier : true,
blending : transparent
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
// baseColor defines the color and opacity of the final shadow
material.baseColor = vec4(0.0, 0.0, 0.0, 0.7);
}
}
- transparentShadow: 布尔值类型,默认为false。在此材质上启用透明阴影。当启用此功能时,使用抖动模式模拟透明阴影:它们在方差阴影地图(VSM)和模糊启用时工作得最好。阴影的不透明度直接来源于材质的baseColor属性的alpha通道。透明阴影可以在不透明的物体上启用,使它们与不透明的折射/透射物体兼容。
material {
name : "Clear plastic with stickers",
transparentShadow : true,
blending : transparent,
// ...
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
material.baseColor = texture(materialParams_baseColor, getUV0());
}
}
- clearCoatIorChange: 布尔类型,默认是true。在添加透明涂层时,考虑到折射率(IoR)的变化来修改底层的镜面颜色。这似乎使baseColor变暗。当此效果被禁用时,baseColor保持不变。请参见图37,查看此属性如何影响红色金属基础层的示例。
material {
clearCoatIorChange : false
}
- multiBounceAmbientOcclusion: 布尔类型,默认值:桌面为true,移动平台为false。当将环境遮挡应用于基于图像的照明时,多反弹环境遮挡考虑了相互反射。开启此功能可避免遮挡区域过度变暗。它还考虑了表面颜色来生成彩色环境遮挡。图38比较了有和没有多弹跳环境遮挡的表面的环境遮挡项。注意多重反射环境遮挡如何在被遮挡的区域引入颜色。图39在点亮的砖块材料上切换多重反射环境遮挡的开启和关闭,以突出此属性的效果。
material {
multiBounceAmbientOcclusion : true
}
- specularAmbientOcclusion: string类型,可能的值为none, simple or bentNormals,默认情况,移动平台为none,桌面为simple。静态环境遮挡贴图和动态环境遮挡贴图(SSAO等)适用于漫射间接照明。当将此属性设置为除了none以外的其他值时,一个新的环境遮挡项将从表面粗糙度中衍生出来,并应用于镜面间接照明。这种效果有助于消除不需要的镜面反射,如图40所示。当这个值设置为simple时,引擎使用一种便宜但近似的方法来计算高光环境遮挡项。如果将此值设置为bentNormals, 引擎将使用更精确但更昂贵的方法。
material {
specularAmbientOcclusion : simple
}
抗锯齿
- specularAntiAliasing: 布尔类型,默认为false。当一个对象移动远离相机,减少镜面锯齿,并保留镜面高光的形状。这种抗锯齿的解决方案对光滑材料(低粗糙度)特别有效,但增加了材质渲染的成本。抗锯齿效果的强度可以使用另外两个属性来控制:specularAntiAliasingVariance和specularAntiAliasingThreshold。
material {
specularAntiAliasing : true
}
- specularAntiAliasingVariance: number类型,值介于0到1之间,默认0.15。设置应用镜面抗锯齿时使用的过滤器内核的屏幕空间方差。较高的值将增加过滤器的效果,但可能增加不需要的区域的粗糙度。
material {
specularAntiAliasingVariance : 0.2
}
- specularAntiAliasingThreshold:number类型,值介于0到1之间,默认0.2。设置用于在应用镜面抗混叠时抑制估计误差的夹持阈值。当设置为0时,镜面反锯齿被禁用。
material {
specularAntiAliasingThreshold : 0.1
}
Shading
- customSurfaceShading: 布尔值,默认为false。 当设置为true时启用自定义表面着色。当表面着色被启用时,碎片着色器必须提供一个额外的功能,该功能将被场景中可能影响当前碎片的每个光线调用。
material {
interpolation : flat
}