glTF全解析——materials
glTF的材质部分,使用的是一组参数来定义材质。这些参数为PBR的各种参数,包括金属性和粗糙性等参数。
结构图
结构图中展示了meshs到materials再到textures之间的过程。
例子
最简单的例子
{
"materials": [
{
"name": "gold",
"pbrMetallicRoughness": {
"baseColorFactor": [ 1.000, 0.766, 0.336, 1.0 ],
"metallicFactor": 1.0,
"roughnessFactor": 0.0
}
}
]
}
上述的代码为最简单的gltf材质的例子,其中包括了材质的名称,和PBR的相关参数。pbrMetallicRoughness中的baseColorFactor为RGBA颜色,metallicFactor和roughnessFactor为0到1之间的float值。关于这两个值如何影响材质的就不展开了,可能会写PBR的相关文章。
加上纹理的例子
{
"materials": [
{
"name": "Material0",
"pbrMetallicRoughness": {
"baseColorFactor": [ 0.5, 0.5, 0.5, 1.0 ],
"baseColorTexture": {
"index": 1,
"texCoord": 1
},
"metallicFactor": 1,
"roughnessFactor": 1,
"metallicRoughnessTexture": {
"index": 2,
"texCoord": 1
}
},
"normalTexture": {
"scale": 2,
"index": 3,
"texCoord": 1
},
"emissiveFactor": [ 0.2, 0.1, 0.0 ]
}
]
}
上述为加上图片的material的数据结构,可以看到在pbrMetallicRoughness中有metallicRoughnessTexture和baseColorTexture贴图,但是在一些引擎中分为metallic和metallic贴图,这样直接两个对应那张metallicRoughnessTexture就可以了。对于baseColorTexture来说,主要是对应了引擎中的基础纹理。除了上述贴图之外,一个material中还有normalTexture、occlusionTexture及emissiveTexture这三个结构类似,在texture中会详细解释。
其他属性
{
"materials": [
{
"name": "Material0",
"pbrMetallicRoughness": {
"baseColorFactor": [ 0.5, 0.5, 0.5, 1.0 ],
"metallicFactor": 1,
"roughnessFactor": 1,
},
"doubleSided": true,
"alphaMode": "OPAQUE"
"emissiveFactor": [ 0.2, 0.1, 0.0 ]
}
]
}
其他属性中主要有alphaMode和doubleSided,alphaMode又有三种模式:
“OPAQUE”:默认模式,完全不透明,忽略任何的alpha值“MASK”:与另一个属性alphaCutoff,如果小于alphaCutoff的值则为完全透明,否则为完全不透明。alphaCutoff值只有在"MASK"模式中生效,其他模式忽略该值。“BLEND”:混合模式,该模式的显示效果取决于各个引擎对该属性的支持。
doubleSided属性,是否为双面贴图。
杂项——点和线的material
上述的属性定义的都是三角片面下的各种情况,当物体为一个点或者一条线时。glTF官方没有给出相关的约束和规范。但是官方也给出了在不同情境的一般处理分为三种情况:
有TANRENT和NORMAL的情况下,按照正常的光照模型和法线贴图进行渲染。没有TANGENT的情况下,没有法线贴图。没有NORMAL的情况下,只输出颜色值,不计算光照。
相关参数
material
类型描述是否必须
namestring材质名Noextensionsobject材质拓展(draco)用Noextrasany其他的补充信息NopbrMetallicRoughnessobjectpbr流程的相关参数NonormalTextureobject法线贴图NoocclusionTextureobject遮蔽贴图对应着AO图NoemissiveTextureobject自发光贴图NoemissiveFactornumber [3]自发光强度No, default: [0,0,0]alphaModestringalpha模式No, default: "OPAQUE"alphaCutoffnumberalpha模式中的"MASK"使用No, default: 0.5doubleSidedboolean是否为双面材质No, default: false
pbrMetallicRoughness
类型描述是否必须
baseColorFactornumber [4]基础颜色No, default: [1,1,1,1]baseColorTextureobject基础的map的图片路径NometallicFactornumber金属感强度No, default: 1roughnessFactornumber粗糙感强度No, default: 1metallicRoughnessTextureobject金属或者粗糙度的图片Noextensionsobject属性拓展Noextrasany附加属性No
normalTexture
类型描述是否必须
indexinteger图片的下标YestexCoordinteger在primitives.attributes中的位置,如果是0则为TEXCOORD_0No, default: 0scalenumber缩放比例,按照scaledNormal = normalize((<sampled normal texture value> * 2.0 - 1.0) * vec3(<normal scale>, <normal scale>, 1.0))来设置No, default: 1extensionsobject拓展的属性Noextrasany附加信息No
occlusionTextureInfo
类型描述是否必须
indexinteger图片的下标YestexCoordinteger在primitives.attributes中的位置,如果是0则为TEXCOORD_0No, default: 0strengthnumber遮蔽强度No, default: 1extensionsobject拓展的属性Noextrasany附加信息No
结束
关于各个的属性的schema,太多了就不贴上来了,想了解具体的直接去官网看就行。 传送门:https://github.com/KhronosGroup/glTF/tree/master/specification/2.0