glTF: Designing an Open-Standard Runtime Asset Format
glTF:一种开放标准运行时资源格式的设计
文章里一些概念:
COLLADA:这是一种开放标准的资源文件格式,用于各种图形软件程序之间交换数字资产
这篇文章主要是提倡另一种资源文件格式,用来给开发者提供一个统一的基础,将美术资源格式转换到统一的渲染引擎在运行时使用的资源格式,文章给这种资源文件格式的名字是glTF。
提议glTF的动机:
解决引擎开发者仍然需要自行构建内容制作流水线和资源传输格式。并存在以下两个问题:
1,资源必须经过处理,以满足GL API 所要求的数据格式。
2,资源必须被组织成适合传输和快速解析的格式。
glTF的目标:
1,定义规范并提供完整的生态
2,开放协作,包括GitHub,社区,Markdown,Issue跟踪
3,从WebGL切入,扩展到整个实时图形领域

glTF 的json结构:

早期的glTF整体结构的设计理念可以概括为三
个方面:
1,场景图为组织核心:Scene → Node → Mesh 的层级来组织整个场景
2,数据与结构分离:Json描述结构场景、引用关系和资源元数据,Buffer/BufferView 存储顶点等数据
3,以引用关系连接资源:引用式设计,减少文件体积,提高运行时加载效率
Buffer 与 BufferView:
Buffer 及其关联的 BufferView 是 glTF 资源最基础的组成部分。glTF借鉴了Typed Array规范中两个基础类型:ArrayBuffer 和 ArrayBufferView 定义了Buffer 和 BufferView 。用于描述Json文件中依赖二进制数据存储的数据,比如顶点,索引等:

这里可以看到,一个office.bin 文件被划分为两个bufferView,Buffer表示一整块连续的二进制数据,BufferView则是其中的一段数据,可以用于划分不同用途的数据块。最终Buffer怎么加载由运行时的引擎决定,或是渐进式加载或是一次性加载。这种结构可以实现数据存储与数据解释的分离,提高了资源共享能力和运行时加载效率。
网格:
在glTF中,网格本质上一个需要被渲染的Primitive数组。
每个Primitive指定了:
1,图元类型
2,索引数据
3,材质
4,顶点属性
这些属性会由同一个Mesh中的多个Primitive共享,换句话说共享同一组顶点属性的多个Primitive会被归为一个Mesh
材质:
glTF中定义了一些材质中必要字段,并对每个字段都会在OpenGL 的API有相应的映射

glTF的材质系统主要可以分为四层:
Material:保存具体材质参数(颜色,纹理,光泽度等)
Technique :定义渲染方法,包括参数、Pass和渲染状态,是多个Material可以共享的渲染模板。
Pass :描述一次渲染所需的完整配置、包括Program、Shader 和 OpenGL状态
Program : 对应实际绑定到GPU的着色器程序

这种分层设计能够让glTF中的材质描述能够映射到OpenGL的底层调用,并通过共享 Technique 来减少 Shader 和状态切换,提高渲染效率
动画:
glTF支持多种业界标准的动画技术:
包括:关键帧动画、蒙皮动画、形态变形
glTF中将动画拆分为了以下几个部分:
Channels、Samplers、Parameters
Parameters:提供关键帧的数据、通常引用bufferViews部分里的某部分bufferView
Samplers:定义了输入、输出和插值方式
Channels:将采样结果绑定到目标节点的某个属性上,比如平移、旋转、缩放
对于蒙皮动画,Channels控制的时骨骼中的关节节点。
COLLADA2GLTF:

定义完每种美术资源如何在glTF的保存后,接下来需要了解的是如何从统一的美术资源格式COLLADA转换到glTF格式。主要阶段按顺序为
1,Triangulate :三角化,将几何体转换为OpenGL支持的图元
2,Single Index:单一索引,规范每个顶点只能使用一个索引
3,Split:网格拆分
4,Skinning optimizations:限制每个顶点能被骨骼影响的最大数量
5,shaders :自动生成与材质描述相对应的shader
6,Json格式化:转换器会把整个数据结构序列化
7,Image conversion:对图片的Alpha通道检查
8,Binary 格式化:将数值数据序列化为多个.bin文件
9,其他资源的处理:这个转换管线支持开发者拓展

参考资料: