GLTF数据格式规范
GLTF文件格式
glTF 导出格式有两种后缀格式可供选择:.gltf 和 .glb:
GLTF文件内容解析
参考:https://www.jianshu.com/p/905671909b25、https://blog.csdn.net/hometoned/article/details/125187834
解析文件时,我习惯于从scene开始解析,gltf文件本身就是一个场景文件。可以从scene开始一步一步去完成整个文件的解析。
解析"materials"字段,包含"name"、"emissiveFactor"、"emissiveTexture"、"normalTexture"、"occlusionTexture"和"pbrMetallicRoughness",主要是提供了pbr渲染时,所需要的纹理信息。
其中"emissiveTexture"、"normalTexture"、"occlusionTexture"三个字段中的"index"值和pbrMetallicRoughness"中包含的"baseColorTexture"和"metallicRoughnessTexture"中的"index"值,对应的是"textures"字段数组的索引。
解析"textures"字段,一般包含"name"、"sampler"和"source"。其中"sampler"对应的是"samplers"数组中的索引;"source"对应的是"images"数组中的索引。
解析"samplers"字段,包含"magFilter"、"minFilter"、"wrapS"、"wrapT"字段。
"magFilter"、"minFilter"对应的是纹理的滤波试,其值:
9728表示GL_NEAREST; 9729表示GL_LINEAR;9984表示GL_NEAREST_MIPMAP_NEAREST;9985表示GL_LINEAR_MIPMAP_NEAREST;9986表示GL_NEAREST_MIPMAP_LINEAR;9987表示GL_LINEAR_MIPMAP_LINEAR 。
"wrapS"、"wrapT"对应的是纹理的环绕方式,其值如:
33071表示GL_CLAMP_TO_EDGE;33648表示GL_MIRRORED_REPEAT;10497表示GL_REPEAT。
解析"images"其中包含"mimeType"、"name"、"uri"和"bufferView"。其中"mimeType"给出了图片的格式。 "uri"也是分为三种情况,如果是glb文件,则这个字段为空,可以通过给出的"bufferView"的索引,查询相关的数据并读取。如果是内嵌式文件,则真实的数据,以base64编码的形式写入文件,解析时,需要base64解码来读取真实的内容,其中前前面的部分字节内容为"***;base64,"表示的是这个文件是什么格式的,并以base64进行了编码处理。之后的字段才是真实的图片内容。如果是外部文件格式的,则其内容为图片的路径。
"bufferView"这个字段,也只是glb时,才会有。
概述
模型加载顺序为,先加载gltf文件,然后解析依次读取scenes、nodes、meshes、accessors、bufferViews、buffers、materials、textures、images。其中每个mesh包括一个bufferViews和一个materials。每一层的递进都有数组下标来确定。
scenes 场景
scenes:[{nodes:0}],
scene:0
一般模型只有一个也是默认场景,如果是多个,则根据对应的scene字段确定哪一个是默认场景,参考数据结构部分的数据,每一个scene都包含一个nodes字段,指定了scene的根结点。本例中nodes对应的值为0,代表根节点为nodes字段下对应的第一个元素。
nodes 节点
nodes:[
{
name:"rootModel",
children:[1]
},
{
name:"floor1",
children:[2]
},
{
name:"room1",
mesh:0
}
]
nodes用来组装模型层级,第一个节点是父节点,children字段指定它所包含的子节点。
nodes节点分为俩种,一种是有children字段的,最终会渲染成group,一种是有mesh字段的最终渲染为mesh,mesh字段的值为meshes数组的小标。
meshes 网络
meshes:[{
name:"mesh1",
primitives:[{attributes:{POSITION:0,NORMAL:1,TEXCOORD_0:0},indices:0, material:0,mode:4}]}]
网格由多个面和材质组成,通过primitives字段指定。
accessors 访问器
accessors:[{name:"postions_0", componentType:5126,count:100, bufferView:0, byteOffset:0,type:"VEC3",max:[],min:[]}]
访问器是链接bufferView和mesh之间的桥梁,主要作用是对bufferView中数据进行进一步描述
bufferViews 缓冲区视图
bufferViews:[
{name:"view0",buffer:0,byteLength: 144, byteOffset: 0, byteStride: 12, target: 34962}
]
buffers 缓冲区
buffers:[{name:1,uri:"1.bin"}]
从mesh走到bin文件,模型的骨骼已经确定了,顶点、法线、面、都有了,剩下的就是给模型添加材质贴图,这一部分也是从mesh出发,由mesh下的material字段指定对应的材质
materials 材质
materials:[
{name:"m0", pbrMetallicRoughness:{baseColorTexture:{index:0}}}
]
textures 纹理
textures:[{name:"t0",source:0}],
images 贴图
images:[{name:"img0",uri:"1.jpg"]
总的流程如下图
压缩优化
npm install gltf-pipeline
作者:WebGiser
链接:https://www.jianshu.com/p/e134a2599cb7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。