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图像文件内容如下:

3D模型查看与格式转换教程配图
图15a:示例引用的图像文件

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

3D模型查看与格式转换教程配图
图15b:示例的渲染结果

使用纹理定义材质属性

本章节,我们使用纹理来提供材质的属性值,代码如下:

"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纹理坐标。