glTF全解析——materials

glTF全解析——materials

glTF的材质部分,使用的是一组参数来定义材质。这些参数为PBR的各种参数,包括金属性和粗糙性等参数。

结构图

结构图中展示了meshsmaterials再到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颜色,metallicFactorroughnessFactor为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中有metallicRoughnessTexturebaseColorTexture贴图,但是在一些引擎中分为metallicmetallic贴图,这样直接两个对应那张metallicRoughnessTexture就可以了。对于baseColorTexture来说,主要是对应了引擎中的基础纹理。除了上述贴图之外,一个material中还有normalTextureocclusionTextureemissiveTexture这三个结构类似,在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 ]
        }
    ]
}

其他属性中主要有alphaModedoubleSided,alphaMode又有三种模式:

  • “OPAQUE”:默认模式,完全不透明,忽略任何的alpha值
  • “MASK”:与另一个属性alphaCutoff,如果小于alphaCutoff的值则为完全透明,否则为完全不透明。alphaCutoff值只有在"MASK"模式中生效,其他模式忽略该值。
  • “BLEND”:混合模式,该模式的显示效果取决于各个引擎对该属性的支持。

doubleSided属性,是否为双面贴图。

杂项——点和线的material

上述的属性定义的都是三角片面下的各种情况,当物体为一个点或者一条线时。glTF官方没有给出相关的约束和规范。但是官方也给出了在不同情境的一般处理分为三种情况:

  • 有TANRENT和NORMAL的情况下,按照正常的光照模型和法线贴图进行渲染。
  • 没有TANGENT的情况下,没有法线贴图。
  • 没有NORMAL的情况下,只输出颜色值,不计算光照。

相关参数

material

类型描述是否必须
namestring材质名No
extensionsobject材质拓展(draco)用No
extrasany其他的补充信息No
pbrMetallicRoughnessobjectpbr流程的相关参数No
normalTextureobject法线贴图No
occlusionTextureobject遮蔽贴图对应着AO图No
emissiveTextureobject自发光贴图No
emissiveFactornumber [3]自发光强度No, default: [0,0,0]
alphaModestringalpha模式No, default: "OPAQUE"
alphaCutoffnumberalpha模式中的"MASK"使用No, default: 0.5
doubleSidedboolean是否为双面材质No, default: false

pbrMetallicRoughness

类型描述是否必须
baseColorFactornumber [4]基础颜色No, default: [1,1,1,1]
baseColorTextureobject基础的map的图片路径No
metallicFactornumber金属感强度No, default: 1
roughnessFactornumber粗糙感强度No, default: 1
metallicRoughnessTextureobject金属或者粗糙度的图片No
extensionsobject属性拓展No
extrasany附加属性No

normalTexture

类型描述是否必须
indexinteger图片的下标Yes
texCoordinteger在primitives.attributes中的位置,如果是0则为TEXCOORD_0No, default: 0
scalenumber缩放比例,按照scaledNormal = normalize((<sampled normal texture value> * 2.0 - 1.0) * vec3(<normal scale>, <normal scale>, 1.0))来设置No, default: 1
extensionsobject拓展的属性No
extrasany附加信息No

occlusionTextureInfo

类型描述是否必须
indexinteger图片的下标Yes
texCoordinteger在primitives.attributes中的位置,如果是0则为TEXCOORD_0No, default: 0
strengthnumber遮蔽强度No, default: 1
extensionsobject拓展的属性No
extrasany附加信息No

结束

关于各个的属性的schema,太多了就不贴上来了,想了解具体的直接去官网看就行。
传送门:https://github.com/KhronosGroup/glTF/tree/master/specification/2.0


版权声明:本文为qq_34205932原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。