gltf格式

  • 是啥?
    khronos推出的,致力于使其成为3D界的JPEG那样的通用格式的一种格式。目前支持多种常用的三维软件通过插件直接读写gltf格式,比如Maya、3dmax、unity等等,assimp也支持了gltf格式的读写。
  • 为啥要用?
    1、glTF = The GL Transmission Format,使用gltf可以享受三维数据格式统一的好处,并避免各个三维软件间处理大量的导入/导出脚本有缩放问题,动画问题,纹理绑定问题,材质问题。甚至连opengl中的纹理平铺方法这类的属性都保存下来,保证效果一定是对的了。
    2、对GL的api非常友好,可以用glBufferData将每个缓冲区加载到GPU中,然后用glVertexAttribPointer解析每个访问器,以绑定到缓冲区中每个顶点元素的位置。
    3、使用pbr材质模型

Scenes and Nodes
可能有多个场景,每个场景可能有多个根节点,但多数情况只有一个场景,一个根节点。
每个节点可以包含一个名为子节点的数组,该数组包含子节点的索引。
应当递归的处理所有节点,伪码如下:

traverse(node) {
    // Process the meshes, cameras, etc., that are
    // attached to this node - discussed later
    processElements(node);
// Recursively process all children
    for each (child in node.children) {
        traverse(child);
    }
}

buffer
一个二进制数据块,用uri定位数据,uri可能指向一个外部的bin文件,或者一个二进制编码的块。由于不知道这个数据到底具体是啥,需要对着说明书bufferview和accessor解读。

//一个buffer可能对应若干bufferview,每个bufferView解读了buffer数据的其中一段:
{
    "buffer" : 0,     //当前这个bufferview描述的是哪个buffer
    "byteOffset" : 0, //byteOffset和byteLength指明数据段起点和长度
    "byteLength" : 72,//
    "target" : 34963//gl的buffer类型,如34963是opengl中的ELEMENT_ARRAY_BUFFER
    //所以真的可以直接扔进opengl
  }


    //一个accessor对应一个bufferview
    {
        "bufferView" : 0,  //对应bufferView数组里的哪个!编号!
        "byteOffset" : 0, //在bufferview中的位置偏移
        "componentType" : 5123,//数据类型,如512为float
        "count" : 36,//数据个数
        "type" : "SCALAR",//数据类型:SCALLAR(标量),VEC3(矢量),MAT4(矩阵)
        "max" : [ 13 ],//在顶点position情况下,min和max属性定义了几何对象的包围盒边界
        "min" : [ 0 ]
      }

  //注意:
  //为了显卡正确读取数据,需要对齐数据。需要遵循以下两个原则:
//1)accessor的byteOffset要能被componeType的长度整除
//2)accessor的byteOffset和bufferView的byteOffset的和要能被componeType的长度整除

mesh
mesh里有若干个primitives,并指明了该primitives都包含哪些数据(vertex、normal、tex),这些数据对应的accessor编号都是什么

 "primitives": [
                {
                    "attributes": {
                        "NORMAL": 1,//法向量数据对应第一个accessor
                        "POSITION": 2//顶点数据对应第二个accessor
                    },
                    "indices": 0,//有indices属性,则此图元用索引方式绘制
                    "mode": 4,//绘制方式,4为TRIANGLES
                    "material": 0
                }
            ]

material
哪些网格用了哪些material在premitive里指定

 "materials" : [ {
    "pbrMetallicRoughness" : {
      "baseColorTexture" : {
        "index" : 0
      },
      "metallicFactor" : 0.0,
      "roughnessFactor" : 1.0
    }
  } ],
"textures": {
  {
    "source": 0,//用的第几个image
    "sampler": 0//用第几个sampler
  }
},
"images": {
  {
    "uri": "testTexture.png"
  }
},
"samplers": {
  {
     "magFilter": 9729,
     "minFilter": 9987,
     "wrapS": 33648,
     "wrapT": 33648
   }
},

ref:
gltf官方overview和links
gltf官方教程 -迅速上手
gltf官方文档 -完全手册
gltf github地址

csdn-gltf格式介绍

gltf测试用模型
gltf online Viewer

你可能感兴趣的:(其他)