gltf规范翻译

gltf是当前比较流行GL传输格式

github中gltf结构图

KhronosGroup组织设计并规范了gltf格式,用于网络的高速传输3D数据。
gltf的核心是一个json文件,它描述了包含3d模型的场景的结构和组成。
json文件的最顶级成员如下:
1. scenes, nodes : 场景的基本结构
2. cameras:场景的视图配置信息
3. meshes:3D模型的几何信息
4. buffers,bufferviews,accessors:数据的引用关系,以及数据的分布情况
5. materials:定义了模型的渲染信息(材质信息)
6. textures,images,samplers:模型的纹理显示
7. skins:顶点的蒙皮信息(骨骼索引,骨骼的权重)
8. animations:动画信息(骨骼动画矩阵等信息)
所有的上述json对象都是以数组的方式组织的,对象之间的引用关系是在数组的对象中描述的。
同时也可以将整个资源打包成一个二进制的gltf文件,此时json数据使用文本文件存储,文本文件后面紧跟着的是buffers(数据)和images(图像)的二进制文件。

概念

gltf的顶级结构以及关联关系如下:
gltf顶级节点结构

二进制数据的引用关系

images和buffers可能引用了一些用于3D模型渲染的外部文件(使用uri的方式引用了图片和一些二进制数据)

"buffers":[
	{
		"uri":"buffer01.bin",
		"byteLength":102040,
	}
],
"images":[
	{
		"uri":"image01.png"
	}
]

buffers使用了外部连接的方式,连接了.bin,这个文件包含了几何数据,还有可能包含了动画数据。
images使用了外部连接的方式,连接了图片文件(png,jpg等),这个文件包含了模型的纹理信息。
数据通过uri方式被引用,也可以将通过base64的方式直接包含在json文件中,例如:

Buffer data:
"data:application/gltf-buffer;base64,AAAAAABBBAAABBBAA..."
Image data(PNG):
"data:image/png;base64,iVBORw0K..."

scenes, nodes

scenes

gltf的json可以包含scenes(使用了默认的scene节点),scenes中的每一个scene包含了一组指定的nodes。例如:
场景结构
可以看到scenes中的每一个nodes成员都包含了一组子节点,这代表了一个简单的场景结构:
场景结构

nodes

nodes结构
nodes中的每一个node可能会包含一个"坐标转换",这个转换可以是列排序的矩阵数组,或者是使用平移、旋转、缩放等表示的坐标转换。旋转的是通过四元数的方式指定的,然后通过M = T x R x S计算出转换矩阵.
每一个node也可能引用了一个mesh或者一个camera,用于指向mesh和camera在数组中的位置,这些节点通过全局的转换矩阵进行坐标变换。
nodes结构
动画也可以引用一个带有平移、旋转、缩放属性的节点,动画用于描述模型如何随着时间改变的,动画依附的模型将会进行相应的运动,例如模型运动或者相机漫游等。
nodes也可能用于顶点蒙皮中,一个node结构定义了动画的骨骼,node使用了一个mesh和蒙皮,蒙皮包含有关网格如何基于当前骨架姿势变形的一些信息。

meshes

meshes可能包含了很多的mesh primitives(图元),这些图元会使用到用于渲染的几何数据。

meshes结构
每一个mesh primitve有一个mode字段,这个mode代表了渲染模型时以什么方式显示,例如POINTS(点)、LINES(线)、TRIANGLES(三角形)方式渲染。这个primitive也可引用indices(绘制索引)和atrributes(顶点属性),这两个字段时一个索引,具体指向的是accessors中的位置,material指向材质。
上面结构中的每一个attribute指向accessors中的位置,这个位置包含了顶点属性的数据指针,例如,顶点的POSITION(顶点)和NORMAL(法线)的数据:
顶点属性数据
一个网格可能定义多个变形目标(变形动画,例如面部表情动画),这种变形目标描述原始网格的变形.
变形动画
如果一个mesh包含了morph targets(变形目标),每一个mesh primitive可以包含一组targets,这是一个字典,将attributes映射到accessors上,target用来替换之前的几何坐标。这个mesh 中也可以包含一组权重值用来计算变形动画最终的顶点位置。
通过多个权重值计算变形动画,例如,一个人物的不同变形动画之间的过渡可以使用权重值进行插值。

buffers,bufferViews,accessors

buffers包含了模型的几何、动画、蒙皮数据.bufferViews包含了数据的结构信息。accessors定义了数据的类型和布局信息。
每一个buffers成员通过uri方式引用了一个二进制文件,uri指定的二进制文件的大小是byteLength
每一个bufferViews成员引用一个buffers成员,它的结构中定义了byteOffsetbyteLength字段用来指定他所使用的buffers中的数据的起始位置和数据长度,同时target字段指定了opengl中对应的buffer类型,例如:顶点数组类型GL_ARRAY_BUFFER、索引类型GL_ELEMENT_ARRAY_BUFFER。这个字段存在的目的就是用于opengl中的var buffer = gl.createBuffer()、gl.bindBuffer(webgl.ARRAY_BUFFER, buffer)、
gl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(vertices), webgl.STATIC_DRAW)这几个函数使用。
accossors用于说明如何解析bufferViews中的数据,这个结构还有可能包含一个byteoffset字段用来指定从bufferViews的哪一个字节开始算起,针对的是各种顶点属性分开创建显存,但是引用的数据都放在了一个bufferViews中。另外accossors还包含type和布局信息。
数据
例如上面的数据结构,定义的是一个2D的向量数据,向量的分量是float类型,componentType指向opengl中的GL_FLOAT(5126)类型,并且数据中的最大值max和最小值min,多个accessors指向同一个bufferViews,就是数字在bufferViews中是交错的,在这种情况下bufferViews中会有一个bytestride字段,这个字段说明了一个accessors成员开始的偏移量。主要是为了填充gl.enableVertexAttribArray(v4PositionIndex);和
gl.vertexAttribPointer(v4PositionIndex, vSize, webgl.FLOAT, false, 0, 0);两个函数所使用。
数据交错

Sparse accessors

变形动画中使用

materials

mesh需使用materials中的一个材质,材质信息包含mesh数据渲染的样式基于物理的材质,统一使用PBR材质,保持各个对象显示模型效果的一致性。金属粗糙度表
默认使用Metallic-Roughness-Model(金属粗糙度模型)材质,金属、粗糙度的数值是在0.0~1.0之间的标量,代表的是物体表面的金属、粗糙度信息,金属-粗糙度数据可以通过数据直接传递给shader,也可以通过纹理图片的方式进行采样得到。
材质属性
材质的金属粗糙度模型信息是放在了pbrMetallicRoughness属性中:
baseColorTexture是模型的主要基本纹理(没有任何的光照等额外信息),baseColorFactor是各个颜色分量的权重值,如果baseColorTexture存在会作为纹理采样的乘数,如果纹理不存在,baseColorFactor表示的是整个物体的颜色。
metallicRoughnessTexture纹理的蓝色通道代表金属度,绿色通道代表的是粗糙度,metallicFactorrougthnessFactor是纹理中金属度和粗糙度的比例因子,如果没有metallicRoughnessTexture纹理,这两个因子就是整个模型的金属度和粗糙度。
金属粗糙度模型中的其他材质属性:
normalTexture包含了模型的切向空间中的法线信息,scale因子是法线的缩放系数。
occlusionTexture定义了微表面中的环境光遮蔽纹理,遮挡的区域颜色比较暗,使用纹理的红色通道代表环境光遮蔽数据,strength代表遮蔽的强度因子。
emissiveTexture表示模型的自发光纹理,emissiveFactor自发光纹理的强度因子。

Material properties in textures

材质结构
materials通过index属性关联纹理textures,同时textures中的texcoord属性对应materials中的TEXCOORD_N纹理坐标,一个模型可能存在多组纹理坐标,不同的纹理可能使用不同的纹理坐标。如果textures中没有texcoord属性,则使用的是默认的纹理坐标,即TEXCOORD_0.

textures, images, samplers

textures中引用的是模型的纹理信息,textures通常会包含source属性(使用的images索引),和sampler属性(使用的samplers索引)。
images中包含的是纹理的真正数据的引用,可以是URI这样的链接,也可以是指向bufferView中的数据,MIME type说明了数据的类型(base64格式的图像数据)。
samplers定义了纹理的环绕方式和纹理坐标的缩放因子,这些数据可以直接传递给glTexParameter函数。
纹理结构

camera

gltf的结构中也可以定义相机属性,相机大致可分为perspective透视相机、orthographic相机,相机中包含了投影矩阵信息,相机属性中可能包含了zfar属性代表的是相机的远裁切面,如果省略了这个字段,代表了无穷远处的远裁切面。
如果scenes中的某个节点指向了这个cameras,对应的相机就会被添加到场景中。

骨骼动画

骨骼动画可作为单独的一部分,后续会做补充

Binary glTF files

在标准的glTF格式中,有两个字段会包含外部的二进制资源,例如:顶点的坐标数据和纹理数据,这些文件可以使用uri的方式引用外部文件,也可以嵌入到glTF的json文件中(base64方式),这些资源的引用方式需要使用http请求的方式下载(无论是uri还是base64),使用base64的方式会大大增加glTF的文件大小。
对于gltf中嵌入二进制数据会增加文件大小的问题,可以使用压缩的方式将glTF 的JSON数据、二进制数据压缩成一个二进制的glTF文件,这个文件是一个.glb格式的小端文件。这个文件包含了headerversion数据大小数据的结构信息,同时会包含一个或者多个chunks的真实数据,第一个chunk包含的是JSON数据,其余的chunk包含的是二进制数据。
glb文件结构

Extensions

glTF中使用扩展的方式添加新的功能,简化常用特性的定义.当glTF中使用扩展的时候,在gltf的json的顶级节点extensionsUsed中会包含扩展列表。extensionsRequired属性列出了正确加载资源所需要的扩展,如果添加了扩展标识符,那么在其他任何标准规范的json节点中可以添加任意的子对象,gltf标准json中填添加的子对象名称需要和extensionsUsed中的名称一致。这些子对象中包含特定属性的进一步扩展。
扩展

目前已经有的扩展

下面的扩展是在github仓库中已经存在的扩展选项。

specular-Glossiness Materials (镜面光泽度材质)

扩展是默认金属粗糙度材质模型的替代品,使用的是镜面光泽度定义材质。

Unlit Materials (无光材质)

这个材质的扩展不是基于物理灯光计算效果。

punctual Materials

这个扩展使得我们可以在场景中添加不同类型的灯光,可以是点光源、聚光灯、方向光。灯光信息附加在json的scene结构中。

WebGL Rendering Techniques

这个扩展可以在gltf中添加自定义的glsl代码。

Texture transforms

这个扩展主要是对于纹理的偏移、旋转、缩放纹理坐标,同时对于多个纹理可以合并成一个纹理图集(合并、压缩纹理)。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值