为什么3D需要通用格式
在glTF出现之前,3D行业分散在数十种不兼容的文件格式中。FBX是Autodesk的专有软件。COLLADA基于XML且显得臃肿。OBJ年代久远,缺乏基础材料。每个游戏引擎、每个网页框架和每个内容创作工具都有自己偏好的格式,转换它们意味着丢失数据、重写着色器,或者手动修复损坏的纹理路径。
网络让这个问题更加严重。随着WebGL的成熟和浏览器获得实时3D图形渲染的能力,开发者需要一种优化于HTTP传输、快速解析JavaScript且能在不依赖厂商特定扩展的情况下表示现代PBR(基于物理的渲染)材料的格式。没有任何现有格式能满足所有这些条件。
2015年,Khronos Group——与OpenGL、Vulkan和WebGL背后的标准机构——发布了glTF的第一个版本。2017年推出了2.0版本,彻底革新了材质模型,迅速成为网络、移动端、增强现实和游戏引擎中实时3D内容交付的主流格式。
glTF代表什么
glTF代表GL传输格式。“GL”指的是OpenGL系列图形API。“传输”部分很关键:glTF不是作为创作格式(你不会在glTF里建模),而是作为一种交付格式。它针对最后一公里优化——将3D资产从创建地点传输到需要渲染的任何地方,且文件大小最小,加载速度最高。
这正是它获得“3DJPEG”绰号的原因。正如JPEG成为网络的通用图像格式,因为它平衡了质量和文件大小,使所有浏览器和设备都能处理,glTF在3D内容中也扮演着同样的角色。它不是适用于所有用途的最佳格式,但它是实时3D传输中最普遍支持的格式。
glTF文件的结构
标准的 glTF 资产最多由三个部分组成。第一个是带有扩展名的JSON文件。这是描述场景图的可读显现表:节点、网格、材质、动画、摄像机和灯光。它不包含二进制数据——仅引用二进制数据的查找位置。.gltf
第二部分是一个或多个带有扩展名的二进制缓冲文件。这些数据以紧凑的二进制格式包含实际顶点位置、法线、纹理坐标、动画关键帧和索引数据。JSON 清单通过 URI 引用这些缓冲区,并规定如何通过访问器和缓冲区视图定义来解释二进制数据。.bin
第三部分是纹理图像,通常为 JPEG 或 PNG 格式,尽管扩展支持 KTX2(GPU 压缩的纹理容器)。纹理由URI从JSON清单中引用,可以作为独立文件存储,也可以嵌入为base64数据URI。
二元变体:GLB
虽然标准 glTF 的多文件结构对开发很方便(你可以手动编辑 JSON),但分发时就不那么方便。你必须把多个文件放在一起,加载它们需要多次HTTP请求。GLB(GL Binary)格式通过将 JSON 清单、所有二进制缓冲区和所有纹理打包到一个带有扩展名的二进制文件中来解决这个问题。.glb
GLB文件的分享、上传和服务要容易得多。单个文件意味着一个HTTP请求,一个拖拽,且没有引用损坏的风险。对于网页上的生产部署,GLB几乎总是更好的选择。在开发和调试方面,多文件 glTF 格式更实用,因为你可以直接检查和编辑 JSON。
PBR材料:材料模型
glTF 2.0 最重要的方面之一是其标准化的物理基渲染材质模型。核心材质采用金属-粗糙度工作流程,由基色(反照率)、金属因子和粗糙度因子定义,且可由纹理驱动。该模型紧凑、易于理解,并直接映射到Unity、Unreal Engine、three.js、Babylon.js以及几乎所有现代渲染器所使用的材质系统。
金属-粗糙度模型意味着无论渲染在哪里,glTF文件看起来基本相同。Chrome球体在three.js、Unreal、谷歌场景查看器和苹果的Reality Composer中看起来都像Chrome。这种一致性相较于FBX或OBJ等格式是巨大的优势,因为材质的定义因模糊或特定引擎而在不同渲染器间差异很大。
除了核心模型外,扩展部分还支持透明涂层(汽车漆面、漆面)、光泽(织物)、透光(玻璃、液体)、体积(蜡、皮肤的次表面散射)和镜面反射(非金属反射)。扩展系统意味着格式可以不断演进而不破坏向下兼容。
动画
glTF支持骨骼动画、变形目标(混合形状)动画以及简单的属性动画,开箱即用。骨骼动画数据以关节和逆绑定矩阵形式存储,平移、旋转和缩放的关键帧数据存储在二进制缓冲区中。变形目标可以实现面部表情和形状变形,而无需骨骼上方。
这使得glTF成为动画角色、带有活动部件的产品配置器和交互式数据可视化的首选格式。动画 glTF 模型可在所有主要的 WebGL 框架、iOS 和 Android 的增强现实浏览器中,以及游戏引擎中无需修改地加载和播放。
关键扩展
glTF扩展生态系统是其最大优势之一。扩展分为批准型(Khronos 官方批准)、多厂商(多个实现支持)或厂商特定扩展。其中一些最重要的扩展包括:
- KHR_draco_mesh_compression:利用谷歌的Draco库压缩网格几何体,密集网格文件大小减少80-95%。
- KHR_texture_basisu:通过 KTX2/Basis Universal 实现 GPU 压缩纹理,显著降低 GPU 内存占用和加载时间。
- KHR_materials_unlit:一种简单的无光照材质,用于风格化内容、性能要求极高的移动应用和将光照嵌入纹理中的摄影测量模型。
- KHR_mesh_quantization:将顶点属性精度从 32 位浮点精度降低至 16 位或 8 位,将缓冲区大小减半,且视觉影响最小。
- KHR_lights_punctual:在场景图中添加点光、聚光和定向光。
- EXT_meshopt_compression:这是Draco的替代方案,优化解码速度而非最大压缩比。
glTF 的使用
glTF的影响力远远超出了网页开发领域。像Shopify这样的电商平台使用glTF/GLB进行3D产品预览。谷歌搜索会直接从搜索结果中显示增强现实中的glTF模型。Facebook 和 Instagram 支持 glTF 进行 3D 帖子。Android 的场景查看器使用 GLB 作为其原生增强现实体验格式。苹果支持在Reality Composer和USDZ转换工具中导入glTF。
在游戏开发中,Unity和Unreal Engine都可以导入glTF资产。Godot 使用 glTF 作为其主要的 3D 导入格式。建筑可视化工具、医学影像软件和数字孪生平台越来越多地支持glTF作为交换格式。
在线查看glTF和GLB文件
将任意 glTF 或 GLB 文件放入 GeometryViewer,即可看到完整的 PBR 材质、动画和纹理渲染。所有程序都运行在浏览器本地。
打开 glTF 查看器glTF并非适用于所有情况
值得注意的是,glTF是一种渲染格式,不是CAD格式。它存储的是网格(三角剖分的曲面),而不是参数化实体模型。你无法像用STEP或IGES文件那样提取尺寸、编辑特征或对glTF模型执行布尔操作。对于工程和制造工作流程来说,CAD原生格式依然不可或缺。对于3D打印,3MF是更好的选择,因为它包含了构建说明和网格完整性保证。
但对于任何涉及实时渲染的内容——无论是网页、移动、增强现实、虚拟现实、游戏、产品可视化、数字孪生还是互动体验——glTF是明确的标准。如果你是向屏幕发送3D内容,glTF应该是默认格式。