glTF支持多种不同的材质属性,这些属性的值可以直接给定,作为整个3D对象的材质属性,也可以通过纹理给定,为3D对象的每一部分提供不同的材质属性值。下面代码就是使用纹理提供材质属性值的一个例子:
{
"scenes" : [ {
"nodes" : [ 0 ]
} ],
"nodes" : [ {
"mesh" : 0
} ],
"meshes" : [ {
"primitives" : [ {
"attributes" : {
"POSITION" : 1,
"TEXCOORD_0" : 2
},
"indices" : 0,
"material" : 0
} ]
} ],
"materials" : [ {
"pbrMetallicRoughness" : {
"baseColorTexture" : {
"index" : 0
},
"metallicFactor" : 0.0,
"roughnessFactor" : 1.0
}
} ],
"textures" : [ {
"sampler" : 0,
"source" : 0
} ],
"images" : [ {
"uri" : "testTexture.png"
} ],
"samplers" : [ {
"magFilter" : 9729,
"minFilter" : 9987,
"wrapS" : 33648,
"wrapT" : 33648
} ],
"buffers" : [ {
"uri" : "data:application/gltf-buffer;base64,AA为了排版而省略,可以使用英文原文中的代码",
"byteLength" : 108
} ],
"bufferViews" : [ {
"buffer" : 0,
"byteOffset" : 0,
"byteLength" : 12,
"target" : 34963
}, {
"buffer" : 0,
"byteOffset" : 12,
"byteLength" : 96,
"byteStride" : 12,
"target" : 34962
} ],
"accessors" : [ {
"bufferView" : 0,
"byteOffset" : 0,
"componentType" : 5123,
"count" : 6,
"type" : "SCALAR",
"max" : [ 3 ],
"min" : [ 0 ]
}, {
"bufferView" : 1,
"byteOffset" : 0,
"componentType" : 5126,
"count" : 4,
"type" : "VEC3",
"max" : [ 1.0, 1.0, 0.0 ],
"min" : [ 0.0, 0.0, 0.0 ]
}, {
"bufferView" : 1,
"byteOffset" : 48,
"componentType" : 5126,
"count" : 4,
"type" : "VEC2",
"max" : [ 1.0, 1.0 ],
"min" : [ 0.0, 0.0 ]
} ],
"asset" : {
"version" : "2.0"
}
}代码中引用的testTexture.png图像文件内容如下:

使用渲染程序渲染这个glTF资源,可以得到下面的结果:

使用纹理定义材质属性
本章节,我们使用纹理来提供材质的属性值,代码如下:
"materials" : [ {
"pbrMetallicRoughness" : {
"baseColorTexture" : {
"index" : 0
},
"metallicFactor" : 0.0,
"roughnessFactor" : 1.0
}
} ],baseColorTexture属性的值是要作为基本颜色值的纹理对象的索引。metallicFactor和roughnessFactor的值仍然直接指定,当然,同样也可以使用纹理来指定。
将纹理张贴在mesh对象上,还需要纹理坐标信息,纹理坐标由mesh对象包含的primitive对象提供。默认情况下,使用的是TEXCOORD_0纹理坐标,如果需要使用多个纹理坐标,可以使用texCoord属性指明使用的是哪一纹理坐标:
"baseColorTexture" : {
"index" : 0,
"texCoord": 2
},上面代码,表示使用TEXCOORD_2纹理坐标。