HappyLifeLife.com
HappyLifeLife.com
HappyLifeLife.com 登录 HappyLifeLife.com 注册 HappyLifeLife.com
爱新闻 爱生活
爱分享 爱学习
爱读书 爱探索
爱音乐 爱宇宙
爱电影 爱地球
爱阅读 爱世界
爱运动 爱科技
爱学习

<< < - > >>
3D
gltf介绍
www.HappyLiveLife.com 收藏 www.happylivelife.com
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
编辑
GLTF数据格式解析,自制模型转换工具GLTF是新的一种高效传输和加载3D场景和模型的格式。可以支持很多实现三维的引擎。GLTF是由Khronos Group设计和规定的。GLTF其实就是一个json文件,描述的就是3D场景数据的组成和构造。GLTF最外层的属性有:1.scenes,nodes,cameras,animations(这些属性描述的就是模型的基本结构)2.mesh,textures,images,samplers(这些属性描述的模型的纹理信息,用于展示场景)3.buffer,bufferViews,accessors(这些属性描述的是场景、模型的点的信息,点的位置,法线和纹理坐标值)4.materials,techniques,programs,shaders(这些属性是场景/模型的材质信息,用于渲染3D模型)5.skins(结合点的表面信息??没用过,给的都是空值) 说到这里,给大家看一个gltf的文件。复制代码{ "accessors": { "accessor_index0": { "bufferView": "bufferView_index", "byteOffset": 0, "byteStride": 0, "componentType": 5123, "count": 231432, "type": "SCALAR" }, "accessor_index1": { "bufferView": "bufferView_index", "byteOffset": 462864, "byteStride": 0, "componentType": 5123, "count": 1020, "type": "SCALAR" }, "accessor_position": { "bufferView": "bufferView_vertex", "byteOffset": 0, "byteStride": 12, "componentType": 5126, "count": 58900, "max": [ 308.304321, 159.551575, 145.747 ], "min": [ 179.30542, -72.13728, 71.62281 ], "type": "VEC3" }, "accessor_normal": { "bufferView": "bufferView_vertex", "byteOffset": 706800, "byteStride": 12, "componentType": 5126, "count": 58900, "max": [ 1.0, 1.0, 1.0 ], "min": [ 1.0, 1.0, 1.0 ], "type": "VEC3" }, "accessor_uv": { "bufferView": "bufferView_vertex", "byteOffset": 1413600, "byteStride": 8, "componentType": 5126, "count": 58900, "max": [ 0.997774363, 0.8115263 ], "min": [ 0.00197040662, 0.00195908546 ], "type": "VEC2" } }, "animations": {}, "asset": { "generator": "infoearth", "premultipliedAlpha": true, "profile": { "api": "webgl", "version": "1.0.2" }, "version": 1 }, "bufferViews": { "bufferView_index": { "buffer": "model_buffer", "byteLength": 464904, "byteOffset": 0, "target": 34963 }, "bufferView_vertex": { "buffer": "model_buffer", "byteLength": 1884800, "byteOffset": 464904, "target": 34962 } }, "buffers": { "model_buffer": { "byteLength": 2349704, "type": "arraybuffer", "uri": "Tile_+004_+004.bin" } }, "images": { "texture0": { "name": "texture0", "uri": "Tile_+004_+004_0.jpg" }, "texture1": { "name": "texture1", "uri": "notexture.png" } }, "materials": { "material0": { "name": "material0", "technique": "technique0", "values": { "diffuse": "texture_texture0" } }, "material1": { "name": "material1", "technique": "technique0", "values": { "diffuse": "texture_texture1" } } }, "meshes": { "mesh_model": { "name": "mesh_model", "primitives": [ { "attributes": { "NORMAL": "accessor_normal", "POSITION": "accessor_position", "TEXCOORD_0": "accessor_uv" }, "indices": "accessor_index0", "material": "material0", "mode": 4 }, { "attributes": { "NORMAL": "accessor_normal", "POSITION": "accessor_position", "TEXCOORD_0": "accessor_uv" }, "indices": "accessor_index1", "material": "material1", "mode": 4 } ] } }, "nodes": { "node": { "children": [], "matrix": [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], "meshes": [ "mesh_model" ], "name": "node" } }, "programs": { "program_0": { "attributes": [ "a_normal", "a_position", "a_texcoord0" ], "fragmentShader": "FS", "vertexShader": "VS" } }, "samplers": { "sampler_0": { "magFilter": 9729, "minFilter": 9729, "wrapS": 10497, "wrapT": 10497 } }, "scene": "defaultScene", "scenes": { "defaultScene": { "nodes": [ "node" ] } }, "shaders": { "FS": { "type": 35632, "uri": "FS.glsl" }, "VS": { "type": 35633, "uri": "VS.glsl" } }, "skins": {}, "techniques": { "technique0": { "attributes": { "a_normal": "normal", "a_position": "position", "a_texcoord0": "texcoord0" }, "parameters": { "diffuse": { "type": 35678 }, "modelViewMatrix": { "semantic": "MODELVIEW", "type": 35676 }, "normal": { "semantic": "NORMAL", "type": 35665 }, "normalMatrix": { "semantic": "MODELVIEWINVERSETRANSPOSE", "type": 35675 }, "position": { "semantic": "POSITION", "type": 35665 }, "projectionMatrix": { "semantic": "PROJECTION", "type": 35676 }, "texcoord0": { "semantic": "TEXCOORD_0", "type": 35664 } }, "program": "program_0", "states": { "enable": [ 2929, 2884 ] }, "uniforms": { "u_diffuse": "diffuse", "u_modelViewMatrix": "modelViewMatrix", "u_normalMatrix": "normalMatrix", "u_projectionMatrix": "projectionMatrix" } } }, "textures": { "texture_texture0": { "format": 6408, "internalFormat": 6408, "sampler": "sampler_0", "source": "texture0", "target": 3553, "type": 5121 }, "texture_texture1": { "format": 6408, "internalFormat": 6408, "sampler": "sampler_0", "source": "texture1", "target": 3553, "type": 5121 } }}通过obj格式的数据自己转换的gltf格式的数据。下面简单介绍下其内容。accessors属性里面存放的是点的信息。其中accessor_index0和accessor_index1存储的是点的索引,数据类型是scaler,bufferView属性对应的是存储点的值存储地,可在bufferView里面去找对应的id的buffer信息。byteOffset是当前索引值对应bufferView的偏移量,如果是索引,byteStride是0,如果是点的位置坐标,byteStride是34即12。count是数据的总个数,componentType是点存储的字节数,如果顶点的个数小于65535,及componentType用两个字节就可以,用5123,否则就四个字节用5126批量obj格式直接转gltf在cesium中的模型需要的是gltf或glb格式的文件,之前的做法是用将模型从3d max中导出dae格式的文件(需要插件),然后用collada2gltf工具将dae格式转成gltf。 最近翻看cesium的官博上,推荐了一个obj2gltf的库,地址https://github.com/AnalyticalGraphicsInc/obj2gltf 试用了一下效果不错,但是可惜的是不能批量转gltf,要一个一个执行node命令岂不是很麻烦,所以写一个批处理吧。 这里写图片描述 红框是建立的两个文件夹,一个存放的是obj模型,另一个存放的是转换后的gltf模型。 之后编写批处理程序:@echo offfor /r E:/WebGL/obj2gltf-master/OBJ %%i in (.obj) do node bin/obj2gltf.js %%i Outputpause & exit123@echo off 表示表示在此语句后所有运行的命令都不显示命令行本身for 循环命令,只要条件符合,它将多次执行同一命令。 语法: FOR %%variable IN (set) DO command [command-parameters]%%variable 指定一个单一字母可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。 command 指定对每个文件执行的命令。 command-parameters 为特定命令指定参数或命令行开关。例如一个批处理文件中有一行: for %%c in (.bat .txt) do type %%c则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。node bin/obj2gltf.js %%i Output 这一命令即是将obj转成gltf的命令。OBJ文件不需要任何种文件头(File Header),尽管经常使用几行文件信息的注释作为文件的开头。OBJ文件由一行行文本组成,注释行以符号“#”为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符(\)。注意连接符(\)后面不能出现空格或Tab格,否则将导致文件出错。下列关键字可以在OBJ文件使用。在这个列表中, 关键字根据数据类型排列,每个关键字有一段简短描述。顶点数据(Vertex data):v 几何体顶点(Geometric vertices)vt 贴图坐标点(Texture vertices)vn 顶点法线(Vertex normals)vp 参数空格顶点 (Parameter space vertices)自由形态曲线(Free-form curve)/表面属性(surface attributes):deg 度(Degree)bmat 基础矩阵(Basis matrix)step 步尺寸(Step size)cstype 曲线或表面类型 (Curve or surface type)元素(Elements):p 点(Point)l 线(Line)f 面(Face)curv 曲线(Curve)curv2 2D曲线(2D curve)surf 表面(Surface)自由形态曲线(Free-form curve)/表面主体陈述(surface body statements):parm 参数值(Parameter values )trim 外部修剪循环(Outer trimming loop)hole 内部整修循环(Inner trimming loop)scrv 特殊曲线(Special curve)sp 特殊的点(Special point)end 结束陈述(End statement)自由形态表面之间的连接(Connectivity between free-form surfaces):con 连接 (Connect)成组(Grouping):g 组名称(Group name)s 光滑组(Smoothing group)mg 合并组(Merging group)o 对象名称(Object name)显示(Display)/渲染属性(render attributes):bevel 导角插值(Bevel interpolation)c_interp 颜色插值(Color interpolation)d_interp 溶解插值(Dissolve interpolation)lod 细节层次(Level of detail)usemtl 材质名称(Material name)mtllib 材质库(Material library)shadow_obj 投射阴影(Shadow casting)trace_obj 光线跟踪(Ray tracing)ctech 曲线近似技术(Curve approximation technique)stech 表面近似技术 (Surface approximation technique)OBJ里的面的索引可正可负,为正数时是指顶点的绝对索引,为负时(比如:f -a -b -c),表示从该面位置开始,倒数的第a,b,c个顶点,vn,vt索引也一样。OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思。材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。"usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。GL传输格式(glTF)是一种API中立的运行时资产传送格式。通过为3D内容的传输和加载提供高效,可扩展,可互操作的格式,glTF弥合了3D内容创建工具与现代图形应用程序之间的鸿沟。动机本节不具规范性。传统的3D建模格式被设计用于存储离线使用的数据,主要用于支持桌面系统的创作工作流程。行业标准的3D交换格式允许在不同的建模工具之间以及内容管道之间共享资源。但是,这些类型的格式都无法针对下载速度或运行时的快速加载进行优化。文件往往变得非常大,应用程序需要做大量的处理才能将这些资源加载到GPU加速的应用程序中。寻求高性能的应用很少直接加载建模格式; 相反,他们将模型作为自定义内容管道的一部分离线处理,将资产转换为针对其运行时应用程序优化的专有格式。这导致了不兼容的专有运行时格式的分散市场,并在内容创建管道中重复努力。为一个应用程序导出的3D资产无法在其他应用程序中重用,而无需返回到原始建模,工具特定源和执行另一个专有导出步骤。随着移动和基于网络的3D计算的出现,出现了新的应用程序类型,需要快速,动态地加载标准化的3D资产。数字营销解决方案,电子商务产品可视化和在线模型共享网站仅仅是当前使用WebGL或OpenGL ES构建的连接3D应用程序中的一小部分。除了高效交付的需求之外,这些在线应用程序中的许多都可以从标准的可互操作格式中受益,从而实现用户之间,应用程序之间以及异构分布式内容管道内资产的共享和重用。glTF通过提供一种供应商和运行时无关的格式来解决这些问题,该格式可以用最少的处理加载和渲染。该格式将易于解析的JSON场景描述与一个或多个表示几何,动画和其他丰富数据的二进制文件结合在一起。二进制数据的存储方式可以直接加载到GPU缓冲区中,无需额外的解析或其他操作。使用这种方法,glTF能够忠实地保存具有节点,网格,相机,材质和动画的完整分层场景,同时实现高效传送和快速加载。glTF基础本节不具规范性。glTF资产是JSON文件以及支持的外部数据。具体而言,glTF资产由以下表示:.gltf包含完整场景描述的JSON格式文件():节点层次结构,材质,相机以及网格,动画和其他构造的描述符信息.bin包含几何和动画数据的二进制文件(),以及其他基于缓冲区的数据图像文件(.jpg,.png)为纹理以其他格式定义的资源(如图像)可以存储在通过URI引用的外部文件中,并行存储在GLB容器中,或者使用数据URI直接嵌入到JSON中。有效的glTF资产必须指定其版本。设计目标本节不具规范性。glTF的设计符合以下目标:紧凑的文件大小。虽然网络开发者喜欢尽可能使用明文,但由于尺寸太大,明文编码对于传输3D数据并不实用。glTF JSON文件本身是明文,但它是紧凑和快速的解析。所有大型数据(如几何图形和动画)都存储在比等效文本表示要小得多的二进制文件中。快速加载。glTF数据结构旨在尽可能接近地反映GPU API数据,包括JSON和二进制文件,以减少加载时间。例如,网格的二进制数据可以被视为JavaScript Typed Arrays,并通过简单的数据拷贝直接加载到GPU缓冲区; 不需要解析或进一步处理。运行独立的。glTF不会对目标应用程序或3D引擎做任何假设。除了渲染和动画之外,glTF不指定运行时行为。完整的3D场景表示。从建模包中导出单个对象对于许多应用程序来说是不够的。通常,作者想要将整个场景加载到其应用程序中,包括节点,转换,变换层次结构,网格,材质,相机和动画。glTF努力保留所有这些信息以用于下游应用程序。可扩展性。尽管最初的基本规范支持丰富的功能集,但仍有许多增长和改进的机会。glTF定义了一种机制,允许添加通用和特定于供应商的扩展。glTF的设计采取务实的方法。该格式旨在尽可能接近地反映GPU API,但如果仅这样做,将不存在通常在建模工具和运行时系统中找到的相机,动画或其他功能,并且许多语义信息将丢失译文。通过支持这些常用结构,glTF内容不仅可以加载和渲染,而且可以立即用于更广泛的应用程序,并且在内容管道中需要的重复工作量更少。以下内容不在glTF的初始设计范围内:glTF不是流式格式。glTF中的二进制数据本质上是流式的,并且缓冲区设计允许递增地获取数据。但是这种格式没有其他的流式结构,并且在呈现之前没有实现流式数据的一致性要求与整体下载它的整体性。glTF的目的不是人类可读的,尽管由于以JSON表示,它对开发人员友好。glTF 2.0版不定义几何和其他丰富数据的压缩。然而,设计团队认为,压缩是传输标准中非常重要的一部分,目前已经开始着手定义压缩扩展。3D格式工作组正在开发伙伴关系来定义几何压缩的编解码器选项。glTF定义节点层次结构,材质,动画和几何图形,并将引用外部压缩规范。版本在次要版本中对glTF所做的任何更新都将向后兼容。向后兼容性将确保任何支持加载glTF 2.x资源的客户端实现也能够加载glTF 2.0资产。前向兼容性将允许仅支持glTF 2.0的客户端实现加载glTF 2.x资产,同时优雅地忽略它不理解的任何新功能。次要版本更新可以引入新功能,但不会更改以前存在的任何行为。现有功能可以在次要版本更新中弃用,但不会被删除。预计主要版本更新不会与以前的版本兼容。文件扩展名和MIME类型.gltf 文件使用 model/gltf+json.bin 文件使用 application/octet-stream纹理文件使用image/基于特定图像格式的官方类型。为了与现代Web浏览器兼容,支持以下图像格式:image/jpeg,image/png。JSON编码为了简化客户端实现,glTF对JSON格式和编码有额外的限制。JSON必须使用没有BOM的UTF-8编码。实现注意: glTF导出器不能在JSON文本的开头添加一个字节顺序标记。为了互操作性,客户端实现可能会忽略字节顺序标记的存在,而不是将其视为错误。有关更多信息,请参阅RFC8259的第8部分。本规范中定义的所有字符串(属性名称,枚举)仅使用ASCII字符集,并且必须以纯文本形式写入,例如,"buffer"而不是"\u0062\u0075\u0066\u0066\u0065\u0072"。实现注意事项:这允许通用glTF客户端实现不具有完整的Unicode支持。特定于应用程序的字符串(例如"name"属性值或extras字段内容)可以使用任何符号。JSON对象中的名称(键)必须是唯一的,即不允许使用重复键。的URIglTF使用URI来引用缓冲区和图像资源。这些URI可能指向外部资源,或者是将资源嵌入到JSON中的数据URI。嵌入式资源使用“数据”URI方案(RFC2397)。实现注意:数据URI可以使用JavaScript进行解码,也可以通过HTML标记中的网页浏览器直接使用。客户端实现需要仅支持嵌入式资源和相关外部引用(从RFC3986的角度来看)。客户可以http://根据预期用途自由支持其他方案(如)。实现注意事项:这允许应用程序决定交付的最佳方法:如果不同资产共享许多相同的几何图形,动画或纹理,则可能会首选单独的文件以减少请求的数据总量。使用单独的文件,应用程序可以逐步加载数据,并且不需要为模型中不可见的部分加载数据。如果应用程序更关心单一文件部署,则即使由于base64编码而增加整体大小并且不支持渐进式或按需加载,嵌入数据也可能是首选。或者,资产可以使用GLB容器将JSON和二进制数据存储在一个文件中,而无需base64编码。详情请参阅GLB文件格式规范。概念glTF资产中的顶级数组。请参阅属性参考。财富每个glTF资产都必须有一个asset属性。实际上,它是JSON唯一需要的顶级属性,才能成为有效的glTF。该asset对象必须包含指定资产的目标glTF版本的glTF版本。此外,minVersion可以使用可选属性来指定加载资产所需的最小glTF版本支持。该minVersion属性允许资产创建者指定客户端实施必须支持的最低版本才能加载资产。这与extensionsRequired概念非常相似,只有当客户端支持指定的扩展时才应该加载资产。其他元数据可以存储在可选属性(如generator或)中copyright。例如,{ “ asset ”:{ “ version ”:“ 2.0 ”, “ generator ”:“ collada2gltf @ f356b99aef8868f74877c7ca545f2cd206b9d3b7 ”, “ copyright ”:“ 2017(c)Khronos Group ” }}实现注意:客户端实现应首先检查是否minVersion指定了属性,并确保主要和次要版本都可以被支持。如果没有minVersion指定,则客户端应检查该version属性并确保支持主要版本。加载GLB格式的客户端还应检查JSON块中的属性minVersion和version属性,因为在GLB头中指定的版本仅引用GLB容器版本。指数和名称glTF资源的实体被相应数组中的索引引用,例如,bufferViewa buffer通过指定buffers数组中的缓冲区索引来引用。例如:{ “ buffers ”:[ { “ byteLength ”: 1024, “ uri ”: “ path-to.bin ” } ] “ bufferViews ”:[ { “ buffer ”: 0, “ byteLength ”: 512, “ byteOffset ”: 0 } ]}在这个例子中,buffers与bufferViews具有各只有一个元素。bufferView使用缓冲区索引引用缓冲区:"buffer": 0。鉴于索引用于内部glTF引用,名称用于应用程序特定的用途,例如显示。任何顶级glTF对象都可以有一个name字符串属性用于此目的。这些属性值不能保证是唯一的,因为它们旨在包含创建资产时创建的值。对于属性名称,glTF使用驼峰大小写 likeThis。骆驼案例是JSON和WebGL中常见的命名约定。坐标系和单位glTF使用右手坐标系,也就是+ X和+ Y的叉积得到+ Z。glTF将+ Y定义为up。glTF资产的正面朝向+ Z。所有线性距离的单位都是米。所有角度都以弧度表示。正向旋转是逆时针。的节点的转换和动画信道路径是3D矢量或四元数与下列数据类型和语义:翻译:包含沿x,y和z轴的平移的3D矢量旋转:四元数(x,y,z,w),其中w是标量比例尺:包含沿x,y和z轴的比例因子的3D矢量场景glTF资产包含零个或多个场景,即要呈现的一组可视对象。场景在scenes数组中定义。另一个属性scene(单数注释)标识阵列中的哪个场景在加载时显示。scene.nodes数组中列出的所有节点都必须是根节点(有关详细信息,请参阅下一节)。何时scene未定义,运行时不需要在加载时渲染任何东西。实现注释:这允许应用程序将glTF资源用作各个实体(如材料或网格)的库。以下示例定义了一个包含单个节点的单个场景的glTF资产。{ “ nodes ”:[ { “ name ”: “ singleNode ” } ] “场景”:[ { “ name ”: “ singleScene ”, “ nodes ”:[ 0 ] } ] “场景”: 0 }节点和层次结构glTF资产可以定义节点,即构成要渲染的场景的对象。节点有一个可选name属性。节点也具有变换属性,如下一节所述。节点以非正式方式称为父节点层次结构的节点层次结构进行组织。当没有父节点时,节点称为根节点。节点层次结构使用节点的children属性进行定义,如下例所示:{ “ nodes ”:[ { “名称”: “汽车”, “孩子”:[ 1, 2, 3, 4 ] }, { “名称”: “ wheel_1 ” }, { “ name ”: “ wheel_2 ” }, { “ name ”: “ wheel_3 ” }, { “ name ”: “ wheel_4 ” } ]}所命名的节点Car有四个孩子。每个节点都可以拥有自己的子节点,从而创建节点层次结构。对于版本2.0一致性,glTF节点层次结构不是有向无环图(DAG)或场景图,而是严格树的不相交联合。也就是说,没有节点可能是多于一个节点的直接后代。这一限制意味着简化实施并促进一致性。转换任何节点都可以通过提供一个定义一个局部空间变换任一matrix属性,或任何的translation,rotation和scale 属性(也称为TRS属性)。translation并且scale是FLOAT_VEC3本地坐标系中的值。rotation是一个FLOAT_VEC4单位四元数值,(x, y, z, w)在本地坐标系中。何时matrix被定义,它必须可以分解为TRS。这意味着变换矩阵不能倾斜或剪切。TRS属性被转换为矩阵并按T R S顺序后乘以组成变换矩阵; 首先将比例应用于顶点,然后旋转,然后进行平移。当一个节点是动画的目标(由an引用animation.channel.target)时,只有TRS属性可能存在; matrix将不存在。实现注意:如果变换的行列式为负值,则网格三角面的卷绕顺序应颠倒。这支持用于镜像几何的负缩放。实现注意事项:不可逆转换(例如,将一个轴缩放到零)可能会导致光照和/或可见性伪像。在下面的示例中,名为node的节点Box定义了非默认的旋转和平移。{ “ nodes ”:[ { “名称”: “箱”, “旋转”:[ 0, 0, 0, 1 ] “标度”:[ 1, 1, 1 ] “翻译”: -17.7082, -11.4156, 2.0922 ] } ]}下一个示例使用matrix属性定义带有摄像头的节点的转换,而不是使用单个TRS值:{ “ nodes ”:[ { “名称”: “节点相机”, “照相机”: 1, “矩阵”:[ -0.99975, -0.00679829, 0.0213218, 0, 0.00167596, 0.927325, 0.374254, 0, -0.0223165, 0.374196, -0.927081, 0, -0.0115543, 0.194711, -0.478297, 1 ] } ]}二进制数据存储缓冲区和缓冲区视图甲缓冲器是存储为二进制blob数据。缓冲区可以包含几何体,动画和皮肤的组合。二进制blob允许高效地创建GPU缓冲区和纹理,因为除了解压缩以外,它们不需要额外的解析。资产可以具有任意数量的缓冲文件,以适应各种应用程序的灵活性。缓冲数据是小尾数。所有缓冲区都存储在资产的buffers数组中。以下示例定义了一个缓冲区。该byteLength属性指定了缓冲区文件的大小。该uri属性是缓冲区数据的URI。缓冲区数据也可以作为base64编码数据存储在glTF文件中,并通过数据URI进行引用。{ “ buffers ”:[ { “ byteLength ”: 102040, “ uri ”: “ duck.bin ” } ]}甲bufferView表示数据在缓冲器中的子集,通过一个整数偏移量在指定的缓冲区定义byteOffset属性和byteLength属性来指定缓冲器视图的长度。当缓冲区视图包含顶点索引或属性时,它们必须是其唯一内容,即在同一个缓冲区视图中有多种类型的数据是无效的。实现注意事项:这允许运行时将缓冲区视图数据上载到GPU,而无需任何额外的处理。何时bufferView.target定义,运行时必须使用它来确定数据使用情况,否则可以从网格的访问器对象中推断出来。以下示例定义了两个缓冲区视图:第一个是ELEMENT_ARRAY_BUFFER,它存放索引三角形集合的索引,第二个是保存三角形集合的顶点数据的ARRAY_BUFFER。{ “ bufferViews ”:[ { “缓冲液”: 0, “ byteLength ”: 25272, “ byteOffset ”: 0, “目标”: 34963 }, { “缓冲液”: 0, “ byteLength ”: 76768, “ byteOffset ”: 25272, “ byteStride ”: 32, “目标”: 34962 } ]}缓冲区视图可以有byteStride属性。它意味着结果元素之间的字节距离。该字段仅为包含顶点属性的缓冲区视图定义。缓冲区和缓冲区视图不包含类型信息。他们只是定义从文件中检索的原始数据。在glTF内的对象文件(网格,皮肤,动画)访问缓冲存储器或缓冲液经由视图存取。GLB存储的缓冲区glTF资产可以使用GLB文件容器将所有资源打包到一个文件中。引用GLB存储BIN块的glTF缓冲区必须具有buffer.uri未定义的属性,并且它必须是buffers数组的第一个元素; 字节长度BIN可以比JSON定义的长3个字节,buffer.byteLength以满足GLB填充要求。实现注意事项: 不要求块和缓冲区的长度严格相等,稍微简化glTF到GLB的转换:实现buffer.byteLength在应用GLB填充后不需要更新。在以下示例中,第一个缓冲区对象引用GLB存储的数据,而第二个缓冲区对象指向外部资源:{ “ buffers ”:[ { “ byteLength ”: 35884 }, { “ byteLength ”: 504, “ uri ”: “ external.bin ” } ]}有关GLB文件格式的详细信息,请参阅GLB文件格式规范。访问器网格,皮肤和动画的所有大数据都存储在缓冲区中并通过访问器检索。一个存取器限定用于从内的检索数据作为类型数组的方法bufferView。访问器指定组件类型(例如5126 (FLOAT))和数据类型(例如VEC3),其在组合时定义每个数组元素的完整数据类型。访问者还bufferView使用属性byteOffset和指定数据的位置和大小count。后者指定了元素的数量bufferView,而不是字节数。元素可以是例如顶点索引,顶点属性,动画关键帧等。所有访问器都存储在资产的accessors数组中。下面的片段显示了两个访问器,第一个是用于检索基元索引的标量访问器,第二个是用于检索基元位置数据的3浮点分量矢量访问器。{ “ accessors ”:[ { “ bufferView ”: 0, “ byteOffset ”: 0, “ componentType ”: 5123, “ count ”: 12636, “ max ”:[ 4212 ] “ min ”:[ 0 ] “ type ”: “标志” }, { “ bufferView ”: 1, “ byteOffset ”: 0, “组件类型”: 5126, “计数”: 2399, “最大”:[ 0.961799, 1.6397, 0.539252 ] “分钟”:[ -0.692985, 0.0992937, -0.613282 ] “ type ”: “ VEC3 ” } ]}浮点数据5126 (FLOAT)componentType的数据必须使用IEEE-754单精度格式。的价值观NaN,+Infinity以及-Infinity是不允许的。存取元件尺寸以下表格可用于计算访问器可访问元素的大小。componentType 字节大小5120 (字节) 15121(UNSIGNED_BYTE) 15122 (短) 25123 (UNSIGNED_SHORT) 25125 (UNSIGNED_INT) 45126 (浮动) 4type 组件数量"SCALAR" 1"VEC2" 2"VEC3" 3"VEC4" 4"MAT2" 4"MAT3" 9"MAT4" 16元素大小(以字节为单位) (size in bytes of the 'componentType') (number of components defined by 'type')。例如:{ “ accessors ”:[ { “ bufferView ”: 1, “ byteOffset ”: 7032, “ componentType ”: 5126, “ count ”: 586, “ type ”: “ VEC3 ” } ]}在这个访问器中,componentType是5126(FLOAT),所以每个组件都是四个字节。这type是"VEC3",所以有三个组成部分。每个元素的大小是12个字节(4 3)。访问器边界accessor.min和accessor.max属性是分别含有每分量的最小值和最大值,阵列。导出程序和加载程序必须将这些值视为与访问者具有相同的数据类型componentType,即对整数类型使用整数(不带小数部分的JSON数字),并对5126(FLOAT)使用浮点小数。实现注意: JavaScript客户端实现应该转换JSON解析的浮点加倍到单精度,当componentType是5126(FLOAT)。这可以通过Math.fround函数来完成。虽然这些属性并不是所有访问器用法都需要的,但有时候必须定义最小值和最大值。有关详细信息,请参阅本规范的其他部分。稀疏存取器在描述相对于参考数组的增量更改时,数组的稀疏编码通常比密集编码更具有内存效率。当编码变形目标时(通常,在变形目标中描述一些移位顶点比传送所有变形目标顶点更高效)通常是这种情况。glTF 2.0扩展了访问器结构以实现稀疏数组的高效传输。与标准访问器类似,一个稀疏访问器从存储在a中的数据初始化一个类型元素数组bufferView。最重要的是,一个稀疏存取器包含一个sparse字典,用于描述偏离初始值的元素。该sparse字典包含以下必需属性:count:流离失所的人数。indices:严格增加大小count和特定的整数数组,componentType以存储偏离初始化值的那些元素的索引。values:与阵列中的索引对应的置换元素indices数组。下面的片段显示了一个访问器的例子,sparse其中10个元素与初始化数组有偏差。{ “ accessors ”:[ { “ bufferView ”: 0, “ byteOffset ”: 0, “组件类型”: 5123, “计数”: 12636, “类型”: “ VEC3 ”, “疏”:{ “计数”: 10, “指数”: { “bufferView “:1, ” byteOffset “:0, ” componentType “:5123 }, “值”:{ “ bufferView ”: 2, “ byteOffset ”: 0 } } } ]}稀疏访问器不同于常规访问器,因为该bufferView属性不是必需的。当它被省略时,稀疏存取器被初始化为大小为(size of the accessor element) (accessor.count)字节的零数组。一旦应用稀疏替换,稀疏访问器min和max属性分别对应于最小和最大组件值。当既没有sparse也没有bufferView定义,min并且max属性可以具有任何值。这是针对二进制数据由外部提供(例如,通过扩展)的用例。数据对齐的偏移量accessor成bufferView(即,accessor.byteOffset)和的所述偏移accessor成buffer(即,accessor.byteOffset + bufferView.byteOffset访问者的部件类型的大小的)必须的倍数。当byteStride引用bufferView未定义时,这意味着访问器元素是紧密排列的,即有效步长等于元素的大小。当byteStride定义时,它必须是访问器组件类型大小的倍数。byteStride必须定义,当两个或多个访问器使用相同的bufferView。每一个都accessor必须适合它bufferView,即,accessor.byteOffset + STRIDE (accessor.count - 1) + SIZE_OF_ELEMENT必须小于或等于bufferView.length。出于性能和兼容性的原因,顶点属性的每个元件必须对齐到内部4字节边界bufferView(即,accessor.byteOffset和bufferView.byteStride必须是4的倍数)。矩阵类型的访问器具有按列主要顺序存储的数据; 每列的起始位置必须与4字节边界对齐。要实现这一点,三个type/ componentType组合需要特殊的布局:MAT2,1字节组件| 00| 01| 02| 03| 04| 05| 06| 07| |===|===|===|===|===|===|===|===||m00|m10|---|---|m01|m11|---|---|MAT3,1字节组件| 00| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B||===|===|===|===|===|===|===|===|===|===|===|===||m00|m10|m20|---|m01|m11|m21|---|m02|m12|m22|---|MAT3,2个字节的组件| 00| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| 0F| 10| 11| 12| 13| 14| 15| 16| 17||===|===|===|===|===|===|===|===|===|===|===|===|===|===|===|===|===|===|===|===|===|===|===|===||m00|m00|m10|m10|m20|m20|---|---|m01|m01|m11|m11|m21|m21|---|---|m02|m02|m12|m12|m22|m22|---|---|对齐要求仅适用于每列的开始,因此如果没有更多数据,尾随字节可以省略。实现注释:对于JavaScript,这允许运行时从glTF buffer或ArrayBuffer中有效地创建单个ArrayBuffer bufferView,然后使用accessor一个类型化数组视图(例如Float32Array)将其转换为ArrayBuffer而不进行复制,因为字节偏移量类型数组视图是类型大小的倍数(例如,4for Float32Array)。考虑下面的例子:{ “ bufferViews ”:[ { “缓冲液”: 0, “ byteLength ”: 17136, “ byteOffset ”: 620, “目标”: 34963 } ] “访问者”:[ { “ bufferView ”: 0, “ byteOffset ”: 4608, “ componentType ”: 5123, “ count ”: 5232, “ type ”: “ SCALAR ” } ]}访问上面例子定义的二进制数据可以这样完成:VAR typedView = 新 Uint16Array(缓冲液,存取器。byteOffset + 存取。bufferView。byteOffset,存取器。计数);访问器组件类型的大小是两个字节(componentType无符号短)。访问者byteOffset也可以被两个整除。同样,访问器在缓冲区中的偏移量0是5228(620 + 4608),它可以被二整除。几何任何节点都可以包含一个在其mesh属性中定义的网格。网格可以使用参考skin对象中提供的信息进行蒙皮处理。网格可以有变形目标。网格在glTF中,网格被定义为基元数组。基元对应GPU绘制调用所需的数据。基元指定一个或多个attributes,对应于绘制调用中使用的顶点属性。索引原语还定义了一个indices属性。属性和索引被定义为对包含相应数据的访问器的引用。每个基元还指定对应于GPU基元类型(例如,三角形集合)的材料和基元类型。实现注意事项:将一个网格划分为基元可能会有助于限制每次绘制调用的索引数量。如果material未指定,则使用默认材质。以下示例定义了一个包含一个三角形集合基元的网格:{ “网格”:[ { “基元”:[ { “ attributes ”:{ “ NORMAL ”: 23, “ POSITION ”: 22, “ TANGENT ”: 24, “ TEXCOORD_0 ”: 25 }, “指数”: 21, “材料”: 3, “模式”: 4 } ] } ]}每个属性都被定义为attributes对象的一个属性。属性的名称对应于标识顶点属性的枚举值,例如POSITION。该属性的值是包含数据的访问器的索引。有效的属性语义属性名称包括POSITION,NORMAL,TANGENT,TEXCOORD_0,TEXCOORD_1,COLOR_0,JOINTS_0,和WEIGHTS_0。特定于应用程序的语义必须以下划线开头,例如_TEMPERATURE。下面定义了每个属性语义属性的有效访问者类型和组件类型。名称 访问者类型 组件类型 描述POSITION "VEC3" 5126 (浮动) XYZ顶点位置NORMAL "VEC3" 5126 (浮动) 归一化的XYZ顶点法线TANGENT "VEC4" 5126 (浮动) XYZW顶点切线,其中w分量是表示正切基准的螺旋性的符号值(-1或+1)TEXCOORD_0 "VEC2" 5126 (FLOAT)5121 (UNSIGNED_BYTE)规范化5123 (UNSIGNED_SHORT)规范化 第一组的UV纹理坐标TEXCOORD_1 "VEC2" 5126 (FLOAT)5121 (UNSIGNED_BYTE)规范化5123 (UNSIGNED_SHORT)规范化 第二组UV纹理坐标COLOR_0 "VEC3""VEC4" 5126 (FLOAT)5121 (UNSIGNED_BYTE)规范化5123 (UNSIGNED_SHORT)规范化 RGB或RGBA顶点颜色JOINTS_0 "VEC4" 5121 (UNSIGNED_BYTE)5123 (UNSIGNED_SHORT) 请参阅蒙皮网格属性WEIGHTS_0 "VEC4 5126 (FLOAT)5121 (UNSIGNED_BYTE)规范化5123 (UNSIGNED_SHORT)规范化 请参阅蒙皮网格属性POSITION访问器必须具有min和max定义的属性。TEXCOORD,COLOR,JOINTS,和WEIGHTS属性的语义属性名必须是这样的形式[semantic]_[set_index],如TEXCOORD_0,TEXCOORD_1,COLOR_0。客户端实现必须至少支持两个UV纹理坐标集,一个顶点颜色和一个关节/权重集。扩展可以添加其他属性名称,访问者类型和/或访问者组件类型。为索引的属性语义的所有指标,必须从0开始,并持续:TEXCOORD_0,TEXCOORD_1,等。实现注释:每个原语对应一个WebGL绘图调用(引擎当然可以自由批量绘制调用)。当indices定义一个基元的属性时,它引用访问器用于索引数据,并且drawElements应该使用GL的函数。当indices属性未定义时,drawArrays应使用GL的函数的计数等于属性引用的任何访问器的count attributes属性(对于给定的基元它们都是相等的)。实现注释:如果未指定法线,则客户端实现应计算平坦法线。实现注意事项:当未指定切线时,客户端实现应使用默认的MikkTSpace算法计算切线。为获得最佳结果,网格三角形也应使用默认的MikkTSpace算法进行处理。实现注释:同一个三角形的顶点应该具有相同的tangent.w值。当同一个三角形的顶点有不同的tangent.w值时,切线空间被认为是未定义的。实现注意事项:当指定法线和切线时,客户端实现应该通过取正交和切线xyz向量的叉积并乘以切线的w分量来计算双重值:bitangent = cross(normal, tangent.xyz) tangent.w变形目标变形目标通过扩展网格概念来定义。变形目标是一个形变网格,其中原始属性通过将原始属性添加到目标属性的加权和获得。例如,POSITION索引i处的图元的变形目标顶点以这种方式计算:primitives[i].attributes.POSITION + weights[0] primitives[i].targets[0].POSITION + weights[1] primitives[i].targets[1].POSITION + weights[2] primitives[i].targets[2].POSITION + ...变形目标通过targetsMesh中定义的属性实现primitives。中每个目标targets阵列是映射原始属性到包含顶点变形目标位移数据,目前只有三个属性的存取一个字典(POSITION,NORMAL,和TANGENT)的支持。所有基元都需要以targets相同的顺序列出相同数量的基元。下面定义了每个属性语义属性的有效访问者类型和组件类型。请注意,由于不能移动旋向性,因此在定位数据时省略了用于旋转的w分量TANGENT。名称 访问者类型 组件类型 描述POSITION "VEC3" 5126 (浮动) XYZ顶点位置位移NORMAL "VEC3" 5126 (浮动) XYZ顶点法向位移TANGENT "VEC3" 5126 (浮动) XYZ顶点切线位移POSITION访问器必须具有min和max定义的属性。所有Morph Target的访问者必须count与原始基元的访问者相同。Morph Target也可以定义一个可选mesh.weights属性,用于存储默认目标权重。在没有node.weights属性的情况下,使用这些权重来解析基元属性。当这个属性丢失时,默认的目标权重被假定为零。以下示例通过添加两个变形目标将前面示例中定义的网格扩展为可变形网格:{ “ primitives ”:[ { “ attributes ”:{ “ NORMAL ”: 23, “ POSITION ”: 22, “ TANGENT ”: 24, “ TEXCOORD_0 ”: 25 }, “指数”: 21, “材料”: 3, “目标”:[ { “师范大学”: 33, “ POSITION ”: 32, “切线”: 34 }, { “师范大学”: 43, “ POSITION ”: 42, “切线”: 44 } ] } ] “权重”:[ 0, 0.5 ]}在将变形目标应用于顶点位置和法线之后,可能需要重新计算切线空间。见附录A的细节。实现注释:在glTF中,变形目标的数量不受限制。一致的客户端实现必须至少支持八个变形属性。这意味着,它必须支持包含至少八个变形目标POSITION属性,或包含四个变形目标POSITION和NORMAL属性,或两个变形目标包含POSITION,NORMAL和TANGENT属性。对于包含更多变形属性的资产,渲染器可以选择完全支持它们(例如,通过在软件中执行变形计算),或仅使用权重最高的变形目标的八个属性。皮肤所有皮肤都存储在skins资产的阵列中。每个外观由inverseBindMatrices属性(指向具有IBM数据的访问器)定义,用于将坐标蒙皮放入与每个关节相同的空间中; 以及一个joints数组属性,其中列出了用作关节的节点索引来为皮肤设置动画。关节的顺序在skin.joints数组中定义,并且必须与inverseBindMatrices数据的顺序相匹配。该skeleton属性指向作为关节层次结构根节点。实现注意:定义如何构造用于关节的外观几何体的矩阵(“Bind Shape Matrix”)应该预先乘以网格数据或反向绑定矩阵。实现注意:客户端实现应该仅将骨架根节点的变换应用于蒙皮网格,而忽略蒙皮网格节点的变换。在下面的例子中,忽略位置和旋转的位置node_0和尺度。node_1node_3node_4{ “ nodes ”:[ { “名称”: “ node_0 ”, “孩子”:[ 1 ], “位置”:[ 0.0, 1.0, 0.0 ] }, { “名称”: “ node_1 ”, “孩子”:[ 2 ], “比例”:[ 0.5, 0.5, 0.5 ] }, { “ name ”: “ node_2 ” }, { “名称”: “ Node_3上”, “孩子”:[ 4 ], “位置”:[ 1.0, 0.0, 0.0 ] }, { “名称”: “ Node_4上”, “啮合”: 0, “旋转”:[ 0.0, 1.0, 0.0, 0.0 ], “皮肤”: 0 } ] “皮肤”:[ { “名称”: “ skin_0 ”, “ inverseBindMatrices ”: 0, “接头”:[ 1, 2 ], “骨架”: 1 } ]}剥皮的网格属性用于蒙皮的网格用在顶点着色器中的蒙皮计算中使用的顶点属性来定义。所述JOINTS_0属性数据包含从相应的接头的索引joints阵列应该影响顶点。该WEIGHTS_0属性数据定义指示联合应该如何强烈地影响顶点的权重。下面网状皮定义JOINTS_0和WEIGHTS_0用于三角网格原始顶点属性:{ “网格”:[ { “ name ”: “ skinned-mesh_1 ”, “ primitives ”:[ { “属性”:{ “ JOINTS_0 ”: 179, “作者”: 165, “ POSITION ”: 163, “ TEXCOORD_0 ”: 167, “ WEIGHTS_0 ”: 176 }, “指数”: 161, “材料”: 1, “模式”: 4 } ] } ]}影响一个顶点的关节数量限制为4,因此引用的访问器必须具有VEC4类型和以下组件格式:JOINTS_0:UNSIGNED_BYTE或UNSIGNED_SHORTWEIGHTS_0:FLOAT或归一化UNSIGNED_BYTE或归一化UNSIGNED_SHORT联合层次用于控制蒙皮网格姿态的联合层次结构就是glTF节点层次结构,每个节点都被指定为一个关节。以下示例定义了两个关节的联合层次结构。TODO:对象空间VS世界空间关节有关顶点蒙皮的更多详细信息,请参阅glTF概述。实现注意:节点定义不指定节点是否应视为关节。客户端实现可能希望首先遍历skins数组,标记每个联合节点。实现注意:一个联合可能有附加的常规节点,即使是带有网格的完整节点子图。它通常用于将整个几何体连接到接头而不会被接缝剥落。(即连接到手关节的剑)。请注意,节点变换是节点相对于节点的局部变换,就像“ 变换”部分中所述的glTF节点层次结构中的任何其他节点一样。实例化网格由node.mesh属性实例化。许多节点可以使用相同的网格,这可能会有不同的转换。例如:{ “ nodes ”:[ { “ mesh ”: 11 }, { “网”: 11, “翻译”:[ -20, -1, 0 ] } ]}变形目标在节点内使用以下方式实例化:mesh属性中引用的变形目标。变形目标weights重写属性中weights引用的变形目标mesh。下面的例子使用非默认权重形成了一个Morph Target。{ “ nodes ”:[ { “网格”: 11, “权重”:[ 0, 0.5 ] } ]}使用节点mesh和skin属性的组合在一个节点内实例化一个外观。mesh属性中定义了皮肤实例的网格。该skin属性包含皮肤的实例索引。{ “皮肤”:[ { “ inverseBindMatrices ”: 29, “接头”:[ 1, 2 ] } ] “节点”:[ { “ name ”: “ Skinned mesh node ”, “ mesh ”: 0, “ skin ”: 0 }, { “名称”: “骨架根关节”, “孩子”:[ 2 ], “旋转”:[ 0, 0, 0.7071067811865475, 0.7071067811865476 ] “翻译”:[ 4.61599, -2.032e-06, -5.08e-08 ] }, { “名”: “头”, “翻译”: 8.76635, 0, 0 ] } ]}纹理数据glTF将纹理访问分为三种不同类型的对象:纹理,图像和采样器。纹理所有纹理都存储在资产的textures数组中。纹理由图像资源定义,由source属性和采样器索引(sampler)表示。{ “纹理”:[ { “采样器”: 0, “源”: 2 } ]}实现说明 glTF 2.0仅支持2D纹理。图片由纹理引用的图像存储在images资产的数组中。每个图像包含一个以支持的图像格式之一的外部文件的URI,或一个带有嵌入式base64编码数据的URI,或者对...的引用bufferView; 在这种情况下mimeType必须定义。以下示例显示指向外部PNG图像文件的图像以及引用bufferViewJPEG数据的另一图像。{ “ images ”:[ { “ uri ”: “ duckCM.png ” }, { “ bufferView ”: 14, “ mimeType ”: “ image / jpeg ” } ]}执行记录:当图像数据是通过提供uri和mimeType定义,客户端的实现应该更喜欢JSON定义的MIME类型的在一个由传输层提供。UV坐标的原点(0,0)对应于纹理图像的左上角。下图说明了这一点,其中标准UV空间的所有四个角都显示了相应的UV坐标:必须忽略来自PNG或JPEG容器的任何色彩空间信息(如ICC配置文件,意图等)。实施注意事项:这增加了资产的可移植性,因为并非所有图像解码库都完全支持自定义颜色转换。为了实现正确的渲染,WebGL运行时必须通过设置UNPACK_COLORSPACE_CONVERSION_WEBGL标志来禁用这种转换NONE。取样采样器存储在samplers资产的数组中。每个采样器指定对应于GL类型的过滤器和包装选项。以下示例定义了一个采样器,其中包含线性mag过滤,线性mipmap最小过滤以及S(U)和T(V)中的重复包装。{ “ samplers ”:[ { “ magFilter ”: 9729, “ minFilter ”: 9987, “ wrapS ”: 10497, “ wrapT ”: 10497 } ]}默认过滤实施注意:定义过滤选项时,运行时必须使用它们。否则,可以根据性能或质量目标自由调整过滤条件。纹理映射实现注意:当采样器的缩小过滤器(minFilter)使用纹理映射(NEAREST_MIPMAP_NEAREST,NEAREST_MIPMAP_LINEAR,LINEAR_MIPMAP_NEAREST,或LINEAR_MIPMAP_LINEAR),任何纹理引用采样器需要具有的贴图,例如,通过调用GL的generateMipmap()功能。非Power-Of-Two纹理实现注意:glTF不能保证纹理的尺寸是二的幂。在运行时,如果纹理的宽度或高度不是二的幂次方,则纹理需要调整大小,以便sampler纹理参考时其维度为二幂有一个包装模式(或wrapS或wrapT)等于REPEAT或MIRRORED_REPEAT,或有缩小过滤器(minFilter使用纹理映射)( ,NEAREST_MIPMAP_NEAREST,NEAREST_MIPMAP_LINEAR,LINEAR_MIPMAP_NEAREST或LINEAR_MIPMAP_LINEAR)。物料glTF使用基于基于物理呈现(PBR)的广泛使用的材料表示的一组通用参数来定义材料。具体而言,glTF使用金属粗糙度材料模型。使用材质的这种声明性表示形式可以使glTF文件在各个平台上一致地呈现。金属 - 粗糙材料所有与金属 - 粗糙度材料模型相关的参数都是在物体pbrMetallicRoughness属性下定义的material。以下示例显示了如何使用金属粗糙度参数定义黄金等材质:{ “材料”:[ { “名称”: “金”, “ pbrMetallicRoughness ”:{ “ baseColorFactor ”:[ 1.000, 0.766, 0.336, 1.0 ], “ metallicFactor ”: 1.0, “ roughnessFactor ”: 0.0 } } ]}金属粗糙度材料模型由以下属性定义:baseColor - 材质的基本颜色metallic - 材料的金属性roughness - 材料的粗糙度基础颜色根据金属的价值有两种不同的解释。当材料是金属时,基色是法向入射时的特定测量反射率值(F0)。对于非金属,基色表示材料反射的漫反射颜色。在此模型中,不可能为非金属指定F0值,并使用4%(0.04)的线性值。每个属性(值baseColor,metallic,roughness)可使用的因素或纹理来定义。这些metallic和roughness属性被打包在一个叫做的纹理中metallicRoughnessTexture。如果未给出纹理,则假定此材质模型中的所有相应纹理成分的值都为1.0。如果存在这两个因素和纹理,则该因子值作为相应纹理值的线性乘数。这baseColorTexture是在sRGB空间中,并且在用于任何计算之前必须转换为线性空间。例如,假设[0.9, 0.5, 0.3, 1.0]线性空间中的值是从RGBA中获得的baseColorTexture,并且假定baseColorFactor给定为[0.2, 1.0, 0.7, 1.0]。然后,结果会是[0.9 0.2, 0.5 1.0, 0.3 0.7, 1.0 1.0] = [0.18, 0.5, 0.21, 1.0]以下等式显示如何根据金属 - 粗糙度材料属性计算双向反射分布函数(BRDF)输入(c diff,F 0,α)。除了材质属性之外,如果基元使用属性语义属性指定顶点颜色COLOR_0,则此值将作为其他线性乘数来使用baseColor。const dielectricSpecular = rgb(0.04, 0.04, 0.04) const black = rgb(0, 0, 0)c diff = lerp(baseColor.rgb (1 - dielectricSpecular.r), black, metallic) F 0 = lerp(dieletricSpecular, baseColor.rgb, metallic) α =roughness ^ 2所有实现应该对BRDF输入使用相同的计算。BRDF本身的实现可以根据设备性能和资源限制而变化。有关BRDF计算的更多详细信息,请参阅附录B.其他地图材料定义还提供了额外的地图,这些地图也可以用于金属粗糙度材料模型以及可以通过glTF扩展提供的其他材料模型。材料定义了以下附加映射:法线:切线空间法线贴图。遮挡:遮挡贴图指示间接照明的区域。发射:发射图控制材料发射的光的颜色和强度。以下示例显示了使用pbrMetallicRoughness参数以及其他纹理贴图定义的材质:{ “材料”:[ { “名称”: “ Material0 ”, “ pbrMetallicRoughness ”:{ “ baseColorFactor ”:[ 0.5, 0.5, 0.5, 1.0 ], “ baseColorTexture ”:{ “索引”: 1, “ texCoord ”: 1 }, “ metallicFactor ”: 1, “ roughnessFactor ”: 1, “ metallicRoughnessTexture ”:{ “ index ”: 2, “ texCoord ”: 1 } }, “ normalTexture ”:{ “ scale ”: 2, “ index ”: 3, “ texCoord ”: 1 }, “ emissiveFactor ”:[ 0.2, 0.1, 0.0 ] } ]}实现注意事项:如果一个实现是资源绑定的并且不能支持所有定义的映射,它应该按照以下优先级顺序支持这些附加映射。资源绑定实现应该从底部到顶部放置地图。地图 渲染影响不支持地图时正常 几何图形看起来不如创作的详细。闭塞 模型会在应该更暗的区域显得更亮。发射的 带灯的模型不会亮起。例如,汽车模型的前灯将熄灭而不亮。Alpha覆盖率该alphaMode属性定义了主要因素和纹理的alpha值应该如何解释。α值是在baseColor金属 - 粗糙度材料模型中定义的。alphaMode 可以是以下值之一:OPAQUE - 呈现的输出是完全不透明的,任何alpha值都被忽略。MASK - 根据alpha值和指定的alpha截止值,呈现的输出可能完全不透明或完全透明。此模式用于模拟诸如树叶或铁丝网等几何图形。BLEND - 使用普通的绘画操作(即Porter和Duff over操作符)将渲染的输出与背景组合在一起。此模式用于模拟几何图形,如警告布或动物毛皮。当alphaMode设置为MASK在alphaCutoff属性指定截止阈值。如果alpha值大于或等于该alphaCutoff值,则呈现为完全不透明,否则呈现为完全透明。alphaCutoff其他模式的值将被忽略。实时光栅化器的实现说明:实时光栅化器通常使用深度缓冲区和网格排序来支持阿尔法模式。以下描述了这些类型的渲染器的预期行为。OPAQUE - 为每个像素编写深度值,并且正确输出不需要网格排序。MASK - 深度值不写入alpha测试后丢弃的像素。为所有其他像素写入深度值。正确的输出不需要网格排序。BLEND - 对此模式的支持各不相同。没有完美而快速的解决方案适用于所有情况。实现应尽可能在尽可能多的情况下实现正确的混合输出。是否编写深度值或是否排序取决于实现。例如,实现可以丢弃具有零或接近零alpha值的像素以避免排序问题。两面性该doubleSided属性指定材料是否双面。当此值为false时,启用背面剔除。当此值为true时,禁用背面剔除并启用双面照明。在评估照明方程之前,背面必须使其法线反转。默认材质网格未指定材质时使用的默认材质被定义为没有指定属性的材质。所有应用的默认值material。请注意,除非场景中存在一些照明,否则此材料不会发光并且会变黑。点和线材料本节不具规范性。此规范并未定义此时非三角形基元(如POINTS或LINES)的大小和样式,并且应用程序可使用各种技术来适当渲染这些基元。但是,为了保持一致性,提供了以下建议:POINTS和LINES在视口空间中的宽度应为1px。对于具有NORMAL和TANGENT属性的LINES ,使用包括法线贴图的标准照明进行渲染。对于没有TANGENT属性的点或线条,使用标准照明进行渲染,但忽略材质上的任何法线贴图。对于没有NORMAL属性的POINTS或LINES ,不要计算光照,而是输出COLOR绘制的每个像素的值。相机相机定义了从视图转换到剪辑坐标的投影矩阵。投影可以是透视或正交。相机包含在节点中,因此可以进行转换。他们的世界空间转换矩阵用于计算视图空间转换。摄像机被定义为:本地+ X轴位于右侧,镜头朝向本地-Z轴,摄像机顶部与本地+ Y轴对齐。如果未指定转换,则相机的位置在原点。相机存储在资产的cameras阵列中。每个相机定义一个type属性,指定投影类型(透视或正交),以及定义细节的属性perspective或orthographic属性。根据zfar财产的存在,透视摄像机可以使用有限或无限的投影。以下示例定义了两个透视摄像机,其中提供了Y视野,宽高比和剪切信息的值。{ “相机”:[ { “名称”: “有限立体照相机”, “类型”: “透视”, “透视”:{ “的aspectRatio ”: 1.5, “ yfov ”: 0.660593, “ zfar ”: 100, “ znear ”: 0.01 } }, { “ name ”: “无限透视相机”, “类型”: “透视”, “透视”:{ “ aspectRatio ”: 1.5, “ yfov ”: 0.660593, “ znear ”: 0.01 } } ]}投影矩阵预计运行时使用以下投影矩阵。无限透视投影哪里a等于camera.perspective.aspectRatio;y等于camera.perspective.yfov;n等于camera.perspective.znear。有限透视投影哪里a等于camera.perspective.aspectRatio;y等于camera.perspective.yfov;f等于camera.perspective.zfar;n等于camera.perspective.znear。正投影哪里r等于camera.orthographic.xmag;t等于camera.orthographic.ymag;f等于camera.orthographic.zfar;n等于camera.orthographic.znear。动画glTF通过节点变换的关键帧动画支持关节和蒙皮动画。关键帧数据存储在缓冲区中,并使用访问器在动画中引用。glTF 2.0也以类似的方式支持实例化的Morph目标的动画。注意: glTF 2.0仅支持动画节点转换和Morph目标权重。规范的未来版本可能支持对任意属性进行动画处理,例如材质颜色和纹理变换矩阵。注意: glTF 2.0仅定义动画存储,因此本规范没有定义任何特定的运行时行为,例如:播放顺序,自动启动,循环,时间轴映射等。实现注意: glTF 2.0没有明确定义导入时如何使用动画,但作为一种最佳实践,建议将每个动画自我包含为动作。例如,“Walk”和“Run”动画可能每个都包含多个针对模型各种骨骼的通道。客户端实现可以选择何时播放任何可用的动画。所有动画都存储在animations资产的数组中。动画被定义为一组通道(channels属性)和一组采样器,这些采样器用关键帧数据和插值方法(samplers属性)指定存取器。以下示例显示了预期的动画使用情况。{ “动画”:[ { “ name ”: “使用不同采样器对一个节点的所有属性进行动画处理”, “通道”:[ { “ sampler ”: 0, “ target ”:{ “ node ”: 1, “ path ”: “ rotation ” } }, { “ sampler ”: 1, “ target ”:{ “ node ”: 1, “ path ”: “ scale ” } }, { “ sampler ”: 2, “ target ”:{ “ node ”: 1, “ path ”: “ translation ” } } ] “采样器”:[ { “输入”: 4, “插值”: “线性”, “输出”: 5 }, { “输入”: 4, “插值”: “线性”, “输出”: 6 }, { “输入”: 4, “插值”: “线性”, “输出”: 7 } ] }, { “名称”: “使用不同采样器动画两个节点”, “通道”:[ { “ sampler ”: 0, “ target ”:{ “ node ”: 0, “ path ”: “ rotation ” } }, { “ sampler ”: 1, “ target ”:{ “ node ”: 1, “ path ”: “ rotation ” } } ] “采样器”:[ { “输入”: 0, “插值”: “线性”, “输出”: 1 }, { “输入”: 2, “插值”: “线性”, “输出”: 3 } ] }, { “名称”: “使用相同采样器动画两个节点”, “通道”:[ { “ sampler ”: 0, “ target ”:{ “ node ”: 0, “ path ”: “ rotation ” } }, { “ sampler ”: 0, “ target ”:{ “ node ”: 1, “ path ”: “ rotation ” } } ] “采样器”:[ { “输入”: 0, “插值”: “线性”, “输出”: 1 } ] }, { “名称”: “动画节点旋转通道和其实例化的变形目标的权重”, “通道”:[ { “ sampler ”: 0, “ target ”:{ “ node ”: 1, “ path ”: “ rotation ” } }, { “ sampler ”: 1, “ target ”:{ “ node ”: 1, “ path ”: “权重” } } ] “采样器”:[ { “输入”: 4, “插值”: “线性”, “输出”: 5 }, { “输入”: 4, “插值”: “线性”, “输出”: 6 } ] } ]}通道将关键帧动画的输出值连接到层次结构中的特定节点。频道sampler属性包含包含动画samplers数组中存在的其中一个采样器的索引。该target属性是一个对象,用于标识使用其node属性为哪个节点设置动画,以及要使用哪个节点的动画属性path。非动画属性必须在动画期间保留其值。什么时候node没有定义,频道应该被忽略。有效路径名"translation","rotation","scale",和"weights"。每个动画的采样器都定义了input/ output对:一组浮点标量值,表示以秒为单位的线性时间; 和一组表示动画属性的矢量或标量。所有值都存储在缓冲区中并通过访问器访问; 有关输出访问器类型的信息,请参阅下表。按键之间的插值使用interpolation属性中指定的插值方法执行。支持的interpolation值包括LINEAR,STEP,和CUBICSPLINE。有关样条插补的其他信息,请参见附录C.每个采样器的输入都是相对的t=0,被定义为父animations项的开始。在提供的输入范围之前和之后,应将输出“夹紧”到输入范围的最近端。例如,如果动画的最早采样器输入是t=10,则客户端实现应该在t=0输出被钳位到第一个输出值时开始播放该动画。一个给定的动画中采样器不要求有相同的输入。channel.path 访问器类型 组件类型 描述"translation" "VEC3" 5126 (浮动) XYZ翻译矢量"rotation" "VEC4" 5126 (FLOAT)5120 (BYTE)标准化5121 (UNSIGNED_BYTE)标准化5122 (SHORT)标准化5123 (UNSIGNED_SHORT)标准化 XYZW旋转四元数"scale" "VEC3" 5126 (浮动) XYZ尺度矢量"weights" "SCALAR" 5126 (FLOAT)5120 (BYTE)标准化5121 (UNSIGNED_BYTE)标准化5122 (SHORT)标准化5123 (UNSIGNED_SHORT)标准化 变形目标的权重实现必须使用以下等式f从归一化的整数中获得相应的浮点值,c反之亦然:accessor.componentType INT到浮 浮到INT5120 (字节) f = max(c / 127.0, -1.0) c = round(f 127.0)5121 (UNSIGNED_BYTE) f = c / 255.0 c = round(f 255.0)5122 (短) f = max(c / 32767.0, -1.0) c = round(f 32767.0)5123 (UNSIGNED_SHORT) f = c / 65535.0 c = round(f 65535.0)动画采样的input访问必须具有min和max性质来定义。实现注意:带有非线性时间输入的动画(如Autodesk 3ds Max或Maya中的时间扭曲)不能用glTF动画直接表示。glTF是运行时格式,非线性时间输入在运行时计算起来很昂贵。出口商的实施应该将非线性时间动画抽样为线性输入和输出以获得准确的表示。变形目标动画帧由长度等于动画变形目标中目标数量的标量序列定义。变形目标动画本质上是稀疏的,考虑使用稀疏访问器存储变形目标动画。glTF动画可用于驱动关节或皮肤动画。皮肤动画是通过动画化皮肤关节层次中的关节来实现的。指定扩展glTF定义了一个扩展机制,允许使用新功能扩展基本格式。任何glTF对象都可以有一个可选extensions属性,如下例所示:{ “材料”:[ { “ extensions ”:{ “ KHR_materials_common ”:{ “ technique ”: “ LAMBERT ” } } } ]}在glTF资产中使用的所有扩展必须列在顶层extensionsUsed数组对象中,例如,{ “ extensionsUsed ”:[ “ KHR_materials_common ”, “ VENDOR_physics ” ]}加载和/或渲染资产所需的所有glTF扩展必须列在顶层extensionsRequired数组中,例如,{ “ extensionsRequired ”:[ “ WEB3D_quantized_attributes ” ]}extensionsRequired是一个子集extensionsUsed。所有的值都extensionsRequired必须存在于extensionsUsed。有关glTF扩展的更多信息,请参阅扩展注册表规范。GLB文件格式规范glTF提供了两种可以同时使用的传送选项:glTF JSON指向外部二进制数据(几何,关键帧,皮肤)和图像。glTF JSON嵌入base64编码的二进制数据,以及使用数据URI嵌入图像。对于这些资源,由于base64编码,glTF需要单独的请求或额外的空间。Base64编码需要额外的处理来解码并增加文件大小(编码资源减少约33%)。尽管gzip缓解了文件大小的增加,但解压缩和解码仍会增加显着的加载时间。为了解决这个问题,引入了一个容器格式Binary glTF。在二进制glTF中,glTF资源(JSON,.bin和图像)可以存储在二进制块中。这个二进制blob(可以是一个文件,例如)具有以下结构:一个12字节的序言,标题为header。一个或多个chunks包含JSON内容和二进制数据。所述chunk含JSON可以参考外部资源像往常一样,并且也可以参考存储内的其它资源chunks。例如,想要按需下载纹理的应用程序可能会在Binary glTF中嵌入除图像以外的所有内容。嵌入式base64编码资源仍然受支持,但使用它们效率不高。文件扩展名与Binary glTF一起使用的文件扩展名是.glb。MIME类型使用model/gltf-binary。二进制glTF布局二进制glTF是小端。图1显示了一个Binary glTF资产的例子。图1:二进制glTF布局。以下各节更详细地介绍了结构。头12字节的标题由三个4字节的条目组成:uint32 magicuint32 versionuint32 lengthmagic等于0x46546C67。它是ASCII字符串glTF,可用于将数据识别为Binary glTF。version表示Binary glTF容器格式的版本。该规范定义了版本2。length 是二进制glTF的总长度,包括标题和所有块,以字节为单位。实现注意:加载GLB格式的客户端实现还应该检查JSON块中的资产版本属性,因为在GLB头中指定的版本仅引用GLB容器版本。大块每个块具有以下结构:uint32 chunkLengthuint32 chunkTypeubyte[] chunkDatachunkLength是以chunkData字节为单位的长度。chunkType指示块的类型。细节见表1。chunkData 是块的二进制有效载荷。每个块的开始和结束必须对齐到4个字节的边界。请参阅填充方案的块定义。块必须按照表1中给出的顺序出现。表1:块类型块类型 ASCII 描述 出现次数1。 0x4E4F534A JSON 结构化的JSON内容 12。 0x004E4942 BIN 二进制缓冲区 0或1客户端实现必须忽略具有未知类型的块,以使glTF扩展能够在前两个块之后引用具有新类型的附加块。结构化的JSON内容该块保存结构化的glTF内容描述,因为它将在.gltf文件中提供。实现注意事项:在JavaScript实现中,TextDecoder可以使用API​​从ArrayBuffer中提取glTF内容,然后JSON.parse像往常一样解析JSON 。这个块必须是Binary glTF资产的第一块。通过首先读取这个块,一个实现能够逐步从后续块中检索资源。这样,也可以从二进制glTF资源中只读取选定的资源子集(例如,网格的最粗LOD)。该块必须填充尾部Space字符(0x20)以满足对齐要求。二进制缓冲区该块包含几何图形,动画关键帧,外观和图像的二进制有效内容。有关从JSON引用此块的详细信息,请参阅glTF规范。该块必须是二进制glTF资源的第二块。该块必须用尾部填充(0x00)以满足对齐要求。属性参考对象accessorsparseindicesvaluesanimationanimation samplerchanneltargetassetbufferbufferViewcameraorthographicperspectiveextensionextrasglTF (根对象)imagematerialnormalTextureInfoocclusionTextureInfopbrMetallicRoughnessmeshprimitivenodesamplersceneskintexturetextureInfo访问一个输入到一个bufferView中的类型视图。一个bufferView包含原始的二进制数据。一个访问器提供了一个类型化视图到一个bufferView或者一个bufferView子集中,类似于WebGL vertexAttribPointer()在缓冲区中定义属性的方式。属性类型 描述 需要bufferView integer bufferView的索引。 没有byteOffset integer 相对于bufferView开始的偏移量,以字节为单位。 不,默认值: 0组件类型 integer 属性中组件的数据类型。 ✅ 是标准化 boolean 指定整数数据值是否应归一化。 不,默认值: false计数 integer 此访问器引用的属性数量。 ✅ 是类型 string 指定属性是标量,矢量还是矩阵。 ✅ 是最大 number [1-16] 此属性中每个组件的最大值。 没有分 number [1-16] 此属性中每个组件的最小值。 没有疏 object 稀疏存储偏离其初始值的属性。 没有名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:accessor.schema.jsonaccessor.bufferViewbufferView的索引。未定义时,访问器必须用零初始化; sparse属性或扩展可以用实际值覆盖零。类型:integer要求:不最低:>= 0accessor.byteOffset相对于bufferView开始的偏移量,以字节为单位。这必须是组件数据类型大小的倍数。类型:integer必需:否,默认值:0最低:>= 0相关的WebGL功能:vertexAttribPointer()偏移参数accessor.componentType ✅属性中组件的数据类型。所有有效值都对应于WebGL枚举。相应类型数组是Int8Array,Uint8Array,Int16Array,Uint16Array,Uint32Array,和Float32Array分别。5125(UNSIGNED_INT)仅在访问器包含索引时才允许,即访问器仅由引用primitive.indices。类型:integer要求:是的允许值:5120 字节5121 UNSIGNED_BYTE5122 短5123 UNSIGNED_SHORT5125 UNSIGNED_INT5126 浮动相关的WebGL函数:vertexAttribPointer()类型参数accessor.normalized指定整数数据值是否应归一化(true)为[0,1](对于无符号类型)或[-1,1](对于有符号类型),或者false在访问时直接转换()。该属性仅为包含顶点属性或动画输出数据的访问者定义。类型:boolean必需:否,默认值:false相关的WebGL功能:vertexAttribPointer()标准化参数accessor.count ✅此访问器引用的属性数量,不要与字节数或组件数混淆。类型:integer要求:是的最低:>= 1accessor.type ✅指定属性是标量,矢量还是矩阵。类型:string要求:是的允许值:"SCALAR""VEC2""VEC3""VEC4""MAT2""MAT3""MAT4"accessor.max此属性中每个组件的最大值。数组元素必须被视为与访问者具有相同的数据类型componentType。最小和最大数组长度相同。长度取决于类型属性的值; 它可以是1,2,3,4,9或16。normalized属性对数组值没有影响:它们总是对应于存储在缓冲区中的实际值。当访问器稀疏时,此属性必须包含应用稀疏替换的访问器数据的最大值。类型:number [1-16]要求:不accessor.min此属性中每个组件的最小值。数组元素必须被视为与访问者具有相同的数据类型componentType。最小和最大数组长度相同。长度取决于类型属性的值; 它可以是1,2,3,4,9或16。normalized属性对数组值没有影响:它们总是对应于存储在缓冲区中的实际值。当访问器稀疏时,此属性必须包含应用稀疏替换的访问器数据的最小值。类型:number [1-16]要求:不accessor.sparse稀疏存储偏离其初始值的属性。类型:object要求:不accessor.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不accessor.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名accessor.extras应用程序特定的数据。类型:any要求:不动画关键帧动画。属性类型 描述 需要渠道 渠道 [1-] 一组通道,每个通道都以节点属性中的动画采样器为目标。相同动画的不同频道不能具有相同的目标。 ✅ 是取样器 动画取样器 [1-] 一组采样器,将输入和输出访问器与插值算法组合以定义关键帧图形(但不是其目标)。 ✅ 是名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:animation.schema.jsonanimation.channels ✅一组通道,每个通道都以节点属性中的动画采样器为目标。相同动画的不同频道不能具有相同的目标。类型:频道[1-]要求:是的animation.samplers ✅一组采样器,将输入和输出访问器与插值算法组合以定义关键帧图形(但不是其目标)。类型:动画取样器[1-]要求:是的animation.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不animation.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名animation.extras应用程序特定的数据。类型:any要求:不动画取样器将输入和输出访问器与插值算法相结合以定义关键帧图(但不是其目标)。属性类型 描述 需要输入 integer 包含关键帧输入值(例如时间)的访问器的索引。 ✅ 是插值 string 插值算法。 不,默认值: "LINEAR"产量 integer 访问器的索引,包含关键帧输出值。 ✅ 是扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:animation.sampler.schema.json动画sampler.input ✅包含关键帧输入值(例如时间)的访问器的索引。该访问器必须具有componentType FLOAT。这些值代表以秒为单位的时间time[0] >= 0.0,并严格增加值,即time[n + 1] > time[n]。类型:integer要求:是的最低:>= 0动画sampler.interpolation插值算法。类型:string必需:否,默认值:"LINEAR"允许值:"LINEAR"动画值在关键帧之间线性插值。定位旋转时​​,应使用球面线性插值(slerp)来插值四元数。元素的数字输出必须等于输入元素的数量。"STEP"动画值在第一个关键帧的输出中保持不变,直到下一个关键帧。输出元素的数量必须等于输入元素的数量。"CUBICSPLINE"动画的插值使用具有指定切线的三次样条来计算。输出元素的数量必须等于输入元素数量的三倍。对于每个输入元素,输出存储三个元素,一个入切线,一个样条顶点和一个出切线。使用此插值时必须至少有两个关键帧。动画sampler.output ✅包含关键帧输出值的访问器的索引。在定位TRS目标时,accessor.componentType输出值必须为FLOAT。当针对形态权重时,accessor.componentType输出值的值必须是FLOAT或标准化的整数,其中每个输出元素存储的值等于变形目标的数量。类型:integer要求:是的最低:>= 0动画sampler.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名动画sampler.extras应用程序特定的数据。类型:any要求:不财富有关glTF资产的元数据。属性类型 描述 需要版权 string 适用于显示的版权信息用于表示信任内容创建者。 没有发电机 string 生成这个glTF模型的工具。用于调试。 没有版 string 该资产所针对的glTF版本。 ✅ 是MINVERSION string 此资产所针对的最低glTF版本。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:asset.schema.jsonasset.copyright适用于显示的版权信息用于表示信任内容创建者。类型:string要求:不asset.generator生成这个glTF模型的工具。用于调试。类型:string要求:不asset.version ✅该资产所针对的glTF版本。类型:string要求:是的asset.minVersion此资产所针对的最低glTF版本。类型:string要求:不asset.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名asset.extras应用程序特定的数据。类型:any要求:不缓冲缓冲区指向二进制几何,动画或皮肤。属性类型 描述 需要URI string 缓冲区的uri。 没有byteLength integer 缓冲区的长度(以字节为单位)。 ✅ 是名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:buffer.schema.jsonbuffer.uri缓冲区的uri。相对路径与.gltf文件相关。uri也可以是一个数据URI,而不是引用外部文件。类型:string要求:不格式:urirefbuffer.byteLength ✅缓冲区的长度(以字节为单位)。类型:integer要求:是的最低:>= 1buffer.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不buffer.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名buffer.extras应用程序特定的数据。类型:any要求:不bufferView通常表示缓冲区子集的缓冲区视图。属性类型 描述 需要缓冲 integer 缓冲区的索引。 ✅ 是byteOffset integer 以字节为单位的缓冲区偏移量。 不,默认值: 0byteLength integer bufferView的长度,以字节为单位。 ✅ 是byteStride integer 步幅,以字节为单位。 没有目标 integer GPU缓冲区应该绑定的目标。 没有名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:bufferView.schema.jsonbufferView.buffer ✅缓冲区的索引。类型:integer要求:是的最低:>= 0bufferView.byteOffset以字节为单位的缓冲区偏移量。类型:integer必需:否,默认值:0最低:>= 0bufferView.byteLength ✅bufferView的长度,以字节为单位。类型:integer要求:是的最低:>= 1bufferView.byteStride顶点属性之间的步长,以字节为单位。当这个没有定义时,数据是紧密排列的。当两个或多个访问器使用相同的bufferView时,必须定义此字段。类型:integer要求:不最低:>= 4最大:<= 252相关的WebGL函数:vertexAttribPointer()stride参数bufferView.targetGPU缓冲区应该绑定的目标。类型:integer要求:不允许值:34962 ARRAY_BUFFER34963 ELEMENT_ARRAY_BUFFER相关的WebGL功能:bindBuffer()bufferView.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不bufferView.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名bufferView.extras应用程序特定的数据。类型:any要求:不相机相机的投影。节点可以引用相机来应用变换以将相机放置在场景中。属性类型 描述 需要正字 object 包含用于创建正交投影矩阵的属性的正交相机。 没有透视 object 包含用于创建透视投影矩阵的属性的透视相机。 没有类型 string 指定相机是否使用透视或正交投影。 ✅ 是名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:camera.schema.jsoncamera.orthographic包含用于创建正交投影矩阵的属性的正交相机。类型:object要求:不camera.perspective包含用于创建透视投影矩阵的属性的透视相机。类型:object要求:不camera.type ✅指定相机是否使用透视或正交投影。基于此,相机perspective或orthographic属性将被定义。类型:string要求:是的允许值:"perspective""orthographic"camera.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不camera.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名camera.extras应用程序特定的数据。类型:any要求:不渠道在节点的属性中定位动画的采样器。属性类型 描述 需要取样器 integer 此动画中采样器的索引用于计算目标的值。 ✅ 是目标 object 要指向的节点和TRS属性的索引。 ✅ 是扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:animation.channel.schema.jsonchannel.sampler ✅此动画中采样器的索引用于计算目标的值,例如节点的平移,旋转或缩放(TRS)。类型:integer要求:是的最低:>= 0channel.target ✅要指向的节点和TRS属性的索引。类型:object要求:是的channel.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名channel.extras应用程序特定的数据。类型:any要求:不延期具有扩展特定对象的Dictionary对象。其他属性是允许的。JSON模式:extension.schema.json演员应用程序特定的数据。glTFglTF资产的根对象。属性类型 描述 需要extensionsUsed string [1-] 此资产中某处使用的glTF扩展的名称。 没有extensionsRequired string [1-] 正确加载此资产所需的glTF扩展名。 没有存取 访问 [1-] 一系列访问器。 没有动画 动画 [1-] 一组关键帧动画。 没有财富 object 有关glTF资产的元数据。 是缓冲区 缓冲 [1-] 一组缓冲区。 没有bufferViews bufferView [1-] 一组bufferViews。 没有相机 相机 [1-] 一系列相机。 没有图片 图片 [1-] 一组图像。 没有物料 材料 [1-] 一系列材料。 没有目 网孔 [1-] 一组网格。 没有节点 节点 [1-] 一组节点。 没有取样器 取样器 [1-] 一组采样器。 没有现场 integer 默认场景的索引。 没有场景 现场 [1-] 一系列场景。 没有皮 皮肤 [1-] 一组皮肤。 没有纹理 质地 [1-] 一组纹理。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:glTF.schema.jsonglTF.extensionsUsed此资产中某处使用的glTF扩展的名称。类型:string [1-]数组中的每个元素必须是唯一的。要求:不glTF.extensionsRequired正确加载此资产所需的glTF扩展名。类型:string [1-]数组中的每个元素必须是唯一的。要求:不glTF.accessors一系列访问器。访问器是一个缓冲视图的类型视图。类型:访问器[1-]要求:不glTF.animations一组关键帧动画。类型:动画[1-]要求:不glTF.asset ✅有关glTF资产的元数据。类型:object要求:是的glTF.buffers一组缓冲区。缓冲区指向二进制几何,动画或皮肤。类型:缓冲区[1-]要求:不glTF.bufferViews一组bufferViews。bufferView是通常表示缓冲区子集的缓冲区视图。类型:bufferView[1-]要求:不glTF.cameras一系列相机。相机定义了一个投影矩阵。类型:相机[1-]要求:不glTF.images一组图像。图像定义了用于创建纹理的数据。类型:图片[1-]要求:不glTF.materials一系列材料。一个材质定义了一个基元的外观。类型:材料[1-]要求:不glTF.meshes一组网格。网格是一组要渲染的基元。类型:网格[1-]要求:不glTF.nodes一组节点。类型:节点[1-]要求:不glTF.samplers一组采样器。采样器包含纹理过滤和包装模式的属性。类型:采样器[1-]要求:不glTF.scene默认场景的索引。类型:integer要求:不最低:>= 0glTF.scenes一系列场景。类型:场景[1-]要求:不glTF.skins一组皮肤。皮肤由关节和矩阵定义。类型:皮肤[1-]要求:不glTF.textures一组纹理。类型:纹理[1-]要求:不glTF.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名glTF.extras应用程序特定的数据。类型:any要求:不图片用于创建纹理的图像数据。图像可以被URI或bufferView索引引用。mimeType在后一种情况下是必需的。属性类型 描述 需要URI string 图像的uri。 没有mime类型 string 图像的MIME类型。 没有bufferView integer 包含图像的bufferView的索引。使用此代替图像的uri属性。 没有名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:image.schema.jsonimage.uri图像的uri。相对路径与.gltf文件相关。uri也可以是一个数据URI,而不是引用外部文件。图像格式必须是jpg或png。类型:string要求:不格式:urirefimage.mimeType图像的MIME类型。类型:string要求:不允许值:"image/jpeg""image/png"image.bufferView包含图像的bufferView的索引。使用此代替图像的uri属性。类型:integer要求:不最低:>= 0image.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不image.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名image.extras应用程序特定的数据。类型:any要求:不指数那些偏离其初始值的属性的索引。属性类型 描述 需要bufferView integer 具有稀疏索引的bufferView的索引。引用的bufferView不能有ARRAY_BUFFER或ELEMENT_ARRAY_BUFFER目标。 ✅ 是byteOffset integer 相对于bufferView开始的偏移量,以字节为单位。必须对齐。 不,默认值: 0组件类型 integer 索引数据类型。 ✅ 是扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:accessor.sparse.indices.schema.jsonindices.bufferView ✅具有稀疏索引的bufferView的索引。引用的bufferView不能有ARRAY_BUFFER或ELEMENT_ARRAY_BUFFER目标。类型:integer要求:是的最低:>= 0indices.byteOffset相对于bufferView开始的偏移量,以字节为单位。必须对齐。类型:integer必需:否,默认值:0最低:>= 0indices.componentType ✅索引数据类型。有效值对应于WebGL枚举:5121(UNSIGNED_BYTE),5123(UNSIGNED_SHORT),5125(UNSIGNED_INT)。类型:integer要求:是的允许值:5121 UNSIGNED_BYTE5123 UNSIGNED_SHORT5125 UNSIGNED_INTindices.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名indices.extras应用程序特定的数据。类型:any要求:不材料原始物质的外观。属性类型 描述 需要名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有pbrMetallicRoughness object 一组参数值,用于基于物理渲染(PBR)方法定义金属 - 粗糙度材质模型。未指定时,所有默认值为pbrMetallicRoughnessapply。 没有normalTexture object 法线贴图纹理。 没有occlusionTexture object 遮挡贴图纹理。 没有emissiveTexture object 发射贴图纹理。 没有emissiveFactor number [3] 材料的发射颜色。 不,默认值: [0,0,0]alphaMode string 材质的alpha渲染模式。 不,默认值: "OPAQUE"alphaCutoff number 材料的alpha截止值。 不,默认值: 0.5两面性 boolean 指定材质是否双面。 不,默认值: false其他属性是允许的。JSON模式:material.schema.jsonmaterial.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不material.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名material.extras应用程序特定的数据。类型:any要求:不material.pbrMetallicRoughness一组参数值,用于基于物理渲染(PBR)方法定义金属 - 粗糙度材质模型。未指定时,所有默认值为pbrMetallicRoughnessapply。类型:object要求:不material.normalTexture切线空间法线贴图。纹理包含线性空间中的RGB分量。每个纹元表示切线空间中的法向量的XYZ分量。红色[0到255]映射到X [-1到1]。绿色[0到255]映射到Y [-1到1]。蓝色[128到255]映射到Z [1/255到1]。法线向量使用OpenGL约定,其中+ X是正确的,+ Y是向上的。+ Z指向观众。在GLSL中,这个向量可以像下面这样解压缩:vec3 normalVector = tex2D(normalMap, texCoord) 2 - 1。客户端实现应该在使用光照方程之前对法向量进行归一化。类型:object要求:不material.occlusionTexture遮挡贴图纹理。遮挡值从R通道采样。较高的值表示应该接收完全间接照明的区域,较低的值表示没有间接照明。这些值是线性的。如果存在其他通道(GBA),则在计算遮挡时忽略它们。类型:object要求:不material.emissiveTexture发射图控制材料发出的光的颜色和强度。该纹理包含sRGB色彩空间中的RGB分量。如果存在第四个组件(A),则忽略它。类型:object要求:不material.emissiveFactor材料的发射颜色的RGB分量。这些值是线性的。如果指定了emissiveTexture,则此值将与texel值相乘。类型:number [3]数组中的每个元素必须大于或等于0并小于或等于1。必需:否,默认值:[0,0,0]material.alphaMode材质的alpha渲染模式枚举指定主要因素和纹理的alpha值的解释。类型:string必需:否,默认值:"OPAQUE"允许值:"OPAQUE" alpha值被忽略,呈现的输出完全不透明。"MASK" 呈现的输出不是完全不透明就是完全透明,具体取决于alpha值和指定的alpha截止值。"BLEND"alpha值用于组合源和目标区域。使用普通的绘画操作(即Porter和Duff over操作符)将渲染的输出与背景组合在一起。material.alphaCutoff指定MASK模式下的截止阈值。如果alpha值大于或等于此值,则呈现为完全不透明,否则呈现为完全透明。大于1.0的值将使整个材料呈现完全透明。该值在其他模式下被忽略。类型:number必需:否,默认值:0.5最低:>= 0material.doubleSided指定材质是否双面。当此值为false时,启用背面剔除。当此值为true时,禁用背面剔除并启用双面照明。在评估照明方程之前,背面必须使其法线反转。类型:boolean必需:否,默认值:false网孔一组要渲染的基元。节点可以包含一个网格。节点的变换将网格放置在场景中。属性类型 描述 需要原语 原始 [1-] 一系列基元,每个基元定义要用材质渲染的几何。 ✅ 是权重 number [1-] 应用于变形目标的权重阵列。 没有名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:mesh.schema.jsonmesh.primitives ✅一系列基元,每个基元定义要用材质渲染的几何。类型:原始[1-]要求:是的mesh.weights应用于变形目标的权重阵列。类型:number [1-]要求:不mesh.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不mesh.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名mesh.extras应用程序特定的数据。类型:any要求:不节点节点层次结构中的节点。当节点包含时skin,全部都mesh.primitives必须包含JOINTS_0和WEIGHTS_0属性。一个节点可以有一个matrix或任意组合translation/ rotation/ scale(TRS)的性质。TRS属性被转换为矩阵并按T R S顺序后乘以组成变换矩阵; 首先将比例应用于顶点,然后旋转,然后进行平移。如果没有提供,转换就是身份。当节点针对动画(由animation.channel.target引用)时,只有TRS属性可能存在; matrix将不存在。属性类型 描述 需要相机 integer 该节点引用的相机索引。 没有孩子 integer [1-] 这个节点的子节点的索引。 没有皮肤 integer 此节点引用的皮肤索引。 没有矩阵 number [16] 以列优先顺序存储的浮点4x4转换矩阵。 不,默认值: [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]网孔 integer 此节点中网格的索引。 没有回转 number [4] 节点的单位四元数旋转顺序为(x,y,z,w),其中w是标量。 不,默认值: [0,0,0,1]规模 number [3] 该节点的非均匀缩放,作为沿x,y和z轴的缩放因子给出。 不,默认值: [1,1,1]翻译 number [3] 节点沿x,y和z轴的平移。 不,默认值: [0,0,0]权重 number [1-] 实例化的Morph Target的权重。元素数量必须与使用的网格的变形目标数量相匹配。 没有名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:node.schema.jsonnode.camera该节点引用的相机索引。类型:integer要求:不最低:>= 0node.children这个节点的子节点的索引。类型:integer [1-]数组中的每个元素必须是唯一的。数组中的每个元素必须大于或等于0。要求:不node.skin此节点引用的皮肤索引。类型:integer要求:不最低:>= 0node.matrix以列优先顺序存储的浮点4x4转换矩阵。类型:number [16]必需:否,默认值:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]相关的WebGL函数:uniformMatrix4fv()转置参数等于falsenode.mesh此节点中网格的索引。类型:integer要求:不最低:>= 0node.rotation节点的单位四元数旋转顺序为(x,y,z,w),其中w是标量。类型:number [4]数组中的每个元素必须大于或等于-1并小于或等于1。必需:否,默认值:[0,0,0,1]node.scale该节点的非均匀缩放,作为沿x,y和z轴的缩放因子给出。类型:number [3]必需:否,默认值:[1,1,1]node.translation节点沿x,y和z轴的平移。类型:number [3]必需:否,默认值:[0,0,0]node.weights实例化的Morph Target的权重。元素数量必须与使用的网格的变形目标数量相匹配。类型:number [1-]要求:不node.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不node.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名node.extras应用程序特定的数据。类型:any要求:不normalTextureInfo参考纹理。属性类型 描述 需要指数 integer 纹理的索引。 ✅ 是texCoord integer 用于纹理坐标映射的纹理的TEXCOORD属性的设置索引。 不,默认值: 0规模 number 标量乘数应用于法线纹理的每个法线矢量。 不,默认值: 1扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:material.normalTextureInfo.schema.jsonnormalTextureInfo.index ✅纹理的索引。类型:integer要求:是的最低:>= 0normalTextureInfo.texCoord此整数值用于构造TEXCOORD_格式的字符串,该格式是对mesh.primitives.attributes中的键的引用(例如,值0对应于TEXCOORD_0)。类型:integer必需:否,默认值:0最低:>= 0normalTextureInfo.scale标量乘数应用于纹理的每个法线矢量。该值使用以下公式缩放法向量:scaledNormal = normalize((normalize() 2.0 - 1.0) vec3(, , 1.0))。如果未指定normalTexture,则此值将被忽略。这个值是线性的。类型:number必需:否,默认值:1normalTextureInfo.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名normalTextureInfo.extras应用程序特定的数据。类型:any要求:不occlusionTextureInfo参考纹理。属性类型 描述 需要指数 integer 纹理的索引。 ✅ 是texCoord integer 用于纹理坐标映射的纹理的TEXCOORD属性的设置索引。 不,默认值: 0强度 number 标量乘数控制应用的遮挡量。 不,默认值: 1扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:material.occlusionTextureInfo.schema.jsonocclusionTextureInfo.index ✅纹理的索引。类型:integer要求:是的最低:>= 0occlusionTextureInfo.texCoord此整数值用于构造TEXCOORD_格式的字符串,该格式是对mesh.primitives.attributes中的键的引用(例如,值0对应于TEXCOORD_0)。类型:integer必需:否,默认值:0最低:>= 0occlusionTextureInfo.strength标量乘数控制应用的遮挡量。值为0.0意味着没有遮挡。值为1.0意味着完全闭塞。该值使用以下公式影响结果颜色:occludedColor = lerp(color, color , )。如果未指定相应的纹理,则此值将被忽略。这个值是线性的。类型:number必需:否,默认值:1最低:>= 0最大:<= 1occlusionTextureInfo.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名occlusionTextureInfo.extras应用程序特定的数据。类型:any要求:不正字包含用于创建正交投影矩阵的属性的正交相机。属性类型 描述 需要xmag number 视图的浮点水平放大。 ✅ 是ymag number 视图的浮点垂直放大。 ✅ 是zfar number 到远剪裁平面的浮点距离。zfar必须大于znear。 ✅ 是znear number 到近剪裁平面的浮点距离。 ✅ 是扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:camera.orthographic.schema.jsonorthographic.xmag ✅视图的浮点水平放大。类型:number要求:是的orthographic.ymag ✅视图的浮点垂直放大。类型:number要求:是的orthographic.zfar ✅到远剪裁平面的浮点距离。zfar必须大于znear。类型:number要求:是的最低:> 0orthographic.znear ✅到近剪裁平面的浮点距离。类型:number要求:是的最低:>= 0orthographic.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名orthographic.extras应用程序特定的数据。类型:any要求:不pbrMetallicRoughness一组参数值,用于基于物理渲染(PBR)方法定义金属 - 粗糙度材质模型。属性类型 描述 需要baseColorFactor number [4] 材质的基本色彩因子。 不,默认值: [1,1,1,1]baseColorTexture object 基本的颜色纹理。 没有metallicFactor number 材料的金属性。 不,默认值: 1roughnessFactor number 材料的粗糙度。 不,默认值: 1metallicRoughnessTexture object 金属粗糙度纹理。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:material.pbrMetallicRoughness.schema.jsonpbrMetallicRoughness.baseColorFactor材质基色的RGBA分量。第四部分(A)是材料的α覆盖率。该alphaMode属性指定了如何解释alpha。这些值是线性的。如果指定了baseColorTexture,则此值将与texel值相乘。类型:number [4]数组中的每个元素必须大于或等于0并小于或等于1。必需:否,默认值:[1,1,1,1]pbrMetallicRoughness.baseColorTexture基本的颜色纹理。该纹理包含sRGB色彩空间中的RGB(A)分量。前三个组件(RGB)指定了材质的基本颜色。如果第四个组分(A)存在,它代表材料的α覆盖率。否则,假定为1.0的alpha。该alphaMode属性指定了如何解释alpha。存储的纹理元素不得预乘。类型:object要求:不pbrMetallicRoughness.metallicFactor材料的金属性。值为1.0意味着材料是金属。值为0.0意味着材料是电介质。两者之间的值用于混合金属和电介质,如肮脏的金属表面。这个值是线性的。如果指定了metallicRoughnessTexture,则此值将与金属texel值相乘。类型:number必需:否,默认值:1最低:>= 0最大:<= 1pbrMetallicRoughness.roughnessFactor材料的粗糙度。值为1.0表示材料完全粗糙。值为0.0表示材料完全平滑。这个值是线性的。如果指定了metallicRoughnessTexture,则此值将与粗糙度texel值相乘。类型:number必需:否,默认值:1最低:>= 0最大:<= 1pbrMetallicRoughness.metallicRoughnessTexture金属粗糙度纹理。金属度值从B通道采样。粗糙度值从G通道采样。这些值是线性的。如果存在其他通道(R或A),则对于金属粗糙度计算它们将被忽略。类型:object要求:不pbrMetallicRoughness.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名pbrMetallicRoughness.extras应用程序特定的数据。类型:any要求:不透视包含用于创建透视投影矩阵的属性的透视相机。属性类型 描述 需要的aspectRatio number 视野的浮点宽高比。 没有yfov number 以弧度表示的浮点垂直视野。 ✅ 是zfar number 到远剪裁平面的浮点距离。 没有znear number 到近剪裁平面的浮点距离。 ✅ 是扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:camera.perspective.schema.jsonperspective.aspectRatio视野的浮点宽高比。如果未定义,则使用画布的高宽比。类型:number要求:不最低:> 0perspective.yfov ✅以弧度表示的浮点垂直视野。类型:number要求:是的最低:> 0perspective.zfar到远剪裁平面的浮点距离。定义时,zfar必须大于znear。如果zfar未定义,则运行时必须使用无限投影矩阵。类型:number要求:不最低:> 0perspective.znear ✅到近剪裁平面的浮点距离。类型:number要求:是的最低:> 0perspective.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名perspective.extras应用程序特定的数据。类型:any要求:不原始用给定材质渲染几何。相关的WebGL功能:drawElements()和drawArrays()属性类型 描述 需要属性 object 一个字典对象,其中每个键对应于网格属性语义,每个值都是包含属性数据的访问器的索引。 ✅ 是指数 integer 包含索引的访问器的索引。 没有材料 integer 渲染时应用于此原始材质的索引。 没有模式 integer 要呈现的基元类型。 不,默认值: 4目标 object [1-] 变形目标的阵列,每个变形目标是一个字典映射属性(只POSITION,NORMAL和TANGENT支持)它们在变形目标偏差。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:mesh.primitive.schema.jsonprimitive.attributes ✅一个字典对象,其中每个键对应于网格属性语义,每个值都是包含属性数据的访问器的索引。类型:object要求:是的每个属性的类型:integerprimitive.indices包含网格索引的访问器的索引。当没有定义时,原语应该在没有索引的情况下使用drawArrays()。在定义时,访问器必须包含索引:访问器bufferView引用的值应该target等于34963(ELEMENT_ARRAY_BUFFER); componentType必须是5121(UNSIGNED_BYTE),5123(UNSIGNED_SHORT)或5125(UNSIGNED_INT),后者可能需要启用额外的硬件支持; type必须"SCALAR"。对于三角形基元,正面具有逆时针(CCW)的顺序。类型:integer要求:不最低:>= 0primitive.material渲染时应用于此原始材质的索引。类型:integer要求:不最低:>= 0primitive.mode要呈现的基元类型。所有有效值都对应于WebGL枚举。类型:integer必需:否,默认值:4允许值:0 点1 LINES2 LINE_LOOP3 LINE_STRIP4 三角形5 TRIANGLE_STRIP6 TRIANGLE_FANprimitive.targets变形目标的阵列,每个变形目标是一个字典映射属性(只POSITION,NORMAL和TANGENT支持)它们在变形目标偏差。类型:object [1-]要求:不primitive.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名primitive.extras应用程序特定的数据。类型:any要求:不取样器滤镜和包装模式的纹理采样器属性。相关的WebGL功能:texParameterf()属性类型 描述 需要magFilter integer 放大滤镜。 没有minFilter integer 缩小过滤器。 没有包装 integer 包装模式。 不,默认值: 10497包起 integer t包装模式。 不,默认值: 10497名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:sampler.schema.jsonsampler.magFilter放大滤镜。有效值对应于WebGL枚举:9728(NEAREST)和9729(LINEAR)。类型:integer要求:不允许值:9728 NEAREST9729 LINEAR相关的WebGL函数:texParameterf()其中pname等于TEXTURE_MAG_FILTERsampler.minFilter缩小过滤器。所有有效值都对应于WebGL枚举。类型:integer要求:不允许值:9728 NEAREST9729 LINEAR9984 NEAREST_MIPMAP_NEAREST9985 LINEAR_MIPMAP_NEAREST9986 NEAREST_MIPMAP_LINEAR9987 LINEAR_MIPMAP_LINEAR相关的WebGL函数:texParameterf()pname等于TEXTURE_MIN_FILTERsampler.wrapSS(U)包装模式。所有有效值都对应于WebGL枚举。类型:integer必需:否,默认值:10497允许值:33071 CLAMP_TO_EDGE33648 MIRRORED_REPEAT10497 重复相关的WebGL函数:texParameterf()pname等于TEXTURE_WRAP_Ssampler.wrapTT(V)包装模式。所有有效值都对应于WebGL枚举。类型:integer必需:否,默认值:10497允许值:33071 CLAMP_TO_EDGE33648 MIRRORED_REPEAT10497 重复相关的WebGL功能:texParameterf()pname等于TEXTURE_WRAP_Tsampler.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不sampler.extensions具有扩展特定对象的Dictionary对象。类型:object需要:不每个属性的类型:扩展名sampler.extras应用程序特定的数据。类型:any要求:不现场场景的根节点。属性类型 描述 需要节点 integer [1-] 每个根节点的索引。 没有名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:scene.schema.jsonscene.nodes每个根节点的索引。类型:integer [1-]数组中的每个元素必须是唯一的。数组中的每个元素必须大于或等于0。要求:不scene.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不scene.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名scene.extras应用程序特定的数据。类型:any要求:不皮肤关节和矩阵定义了一个皮肤。属性类型 描述 需要inverseBindMatrices integer 访问器的索引包含浮点4x4逆绑定矩阵。默认情况是每个矩阵是一个4x4的单位矩阵,这意味着反向绑定矩阵被预先应用。 没有骨架 integer 用作骨架根的节点的索引。未定义时,关节变换解析为场景根。 没有关节 integer [1-] 骨骼节点的索引,用作此皮肤中的关节。 ✅ 是名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:skin.schema.jsonskin.inverseBindMatrices访问器的索引包含浮点4x4逆绑定矩阵。默认情况是每个矩阵是一个4x4的单位矩阵,这意味着反向绑定矩阵被预先应用。类型:integer要求:不最低:>= 0skin.skeleton用作骨架根的节点的索引。未定义时,关节变换解析为场景根。类型:integer要求:不最低:>= 0skin.joints ✅骨骼节点的索引,用作此皮肤中的关节。数组长度必须与访问器的count属性相同inverseBindMatrices(定义时)。类型:integer [1-]数组中的每个元素必须是唯一的。数组中的每个元素必须大于或等于0。要求:是的skin.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不skin.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名skin.extras应用程序特定的数据。类型:any要求:不疏稀疏存储偏离其初始值的属性。属性类型 描述 需要计数 integer 存储在稀疏数组中的条目数。 ✅ 是指数 object count指向偏离初始值的访问器属性的索引数组大小。指数必须严格增加。 ✅ 是值 object 大小乘以数组的count元素数组,存储所指向的置换访问器属性indices。替代值必须componentType与基本访问器具有相同和数量的组件。 ✅ 是扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:accessor.sparse.schema.jsonsparse.count ✅在此稀疏存取器中编码的属性数量。类型:integer要求:是的最低:>= 1sparse.indices ✅count指向偏离初始值的访问器属性的索引数组大小。指数必须严格增加。类型:object要求:是的sparse.values ✅大小乘以数组的count元素数组,存储所指向的置换访问器属性indices。替代值必须componentType与基本访问器具有相同和数量的组件。类型:object要求:是的sparse.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名sparse.extras应用程序特定的数据。类型:any要求:不目标动画频道所针对的节点和TRS属性的索引。属性类型 描述 需要节点 integer 目标节点的索引。 没有路径 string 要修改的节点的TRS属性的名称,或其实例化的变形目标的“权重”。对于“翻译”属性,采样器提供的值是沿着x,y和z轴的平移。对于“旋转”属性,值是按顺序(x,y,z,w)的四元数,其中w是标量。对于“scale”属性,这些值是沿着x,y和z轴的缩放因子。 ✅ 是扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:animation.channel.target.schema.jsontarget.node目标节点的索引。类型:integer要求:不最低:>= 0target.path ✅要修改的节点的TRS属性的名称,或其实例化的变形目标的“权重”。对于“翻译”属性,采样器提供的值是沿着x,y和z轴的平移。对于“旋转”属性,值是按顺序(x,y,z,w)的四元数,其中w是标量。对于“scale”属性,这些值是沿着x,y和z轴的缩放因子。类型:string要求:是的允许值:"translation""rotation""scale""weights"target.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名target.extras应用程序特定的数据。类型:any要求:不质地纹理及其采样器。相关的WebGL功能:createTexture(),deleteTexture(),bindTexture(),texImage2D(),和texParameterf()属性类型 描述 需要取样器 integer 该纹理使用的采样器的索引。未定义时,应使用重复包装和自动过滤的采样器。 没有资源 integer 该纹理使用的图像的索引。 没有名称 string 该对象的用户定义名称。 没有扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:texture.schema.jsontexture.sampler该纹理使用的采样器的索引。未定义时,应使用重复包装和自动过滤的采样器。类型:integer要求:不最低:>= 0texture.source该纹理使用的图像的索引。类型:integer要求:不最低:>= 0texture.name该对象的用户定义名称。这不一定是唯一的,例如,访问器和缓冲区可以具有相同的名称,或者两个访问者甚至可以具有相同的名称。类型:string要求:不texture.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名texture.extras应用程序特定的数据。类型:any要求:不textureInfo参考纹理。属性类型 描述 需要指数 integer 纹理的索引。 ✅ 是texCoord integer 用于纹理坐标映射的纹理的TEXCOORD属性的设置索引。 不,默认值: 0扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:textureInfo.schema.jsontextureInfo.index ✅纹理的索引。类型:integer要求:是的最低:>= 0textureInfo.texCoord这个整数值用于构造一个格式的字符串,该格式TEXCOORD_是对mesh.primitives.attributes中的一个键的引用(例如,A的值0对应于TEXCOORD_0)。网格物体必须具有相应的纹理坐标属性才能应用于该材质。类型:integer必需:否,默认值:0最低:>= 0textureInfo.extensions具有扩展特定对象的Dictionary对象。类型:object要求:不每个属性的类型:扩展名textureInfo.extras应用程序特定的数据。类型:any要求:不值数组大小乘以accessor.sparse.count存储被指向的置换访问器属性的组件数量accessor.sparse.indices。属性类型 描述 需要bufferView integer 具有稀疏值的bufferView的索引。引用的bufferView不能有ARRAY_BUFFER或ELEMENT_ARRAY_BUFFER目标。 ✅ 是byteOffset integer 相对于bufferView开始的偏移量,以字节为单位。必须对齐。 不,默认值: 0扩展 object 具有扩展特定对象的Dictionary对象。 没有演员 any 应用程序特定的数据。 没有其他属性是允许的。JSON模式:accessor.sparse.values.schema.jsonvalues.bufferView ✅具有稀疏值的bufferView的索引。引用的bufferView不能有ARRAY_BUFFER或ELEMENT_ARRAY_BUFFER目标。类型:integer要求:是的最低:>= 0values.byteOffset相对于bufferView开始的偏移量,以字节为单位。必须对齐。类型:integer必需:否,默认值:0最低:>= 0values.extensions具有扩展特定对象的Dictionary对象。类型:object需要:不每个属性的类型:扩展名values.extras应用程序特定的数据。类型:any要求:不致谢Sarah Chow,铯汤姆菲利,铯达里尔高夫Eric Haines,Autodesk余晨侯Scott Hunter,Analytical Graphics,Inc.布兰登琼斯,谷歌肖恩莉莉,铯胡安Linietsky,戈多引擎马修麦克马伦宾夕法尼亚大学的Mohamad MoneimneKai Ninomiya,前身是CesiumCedric Pinson,Sketchfab杰夫罗素,Mar猴Miguel Sousa,Fraunhofer IGDTimo Sturm,Fraunhofer IGDRob Taglang,铯MaikThöner,Fraunhofer IGDSteven Vergenz,AltspaceVRCorentin Wallez,谷歌亚利桑那伍德,分析图形公司附录A:切线空间重新计算去做附录B:BRDF实施本节不具规范性。glTF规范旨在允许应用根据他们的要求选择不同的照明实现。https://github.com/KhronosGroup/glTF-WebGL-PBR/提供了一个实现示例,并提供了基于glTF材质参数的标准BRDF的WebGL实现示例。如前所述const dielectricSpecular = rgb(0.04, 0.04, 0.04) const black = rgb(0, 0, 0)c diff = lerp(baseColor.rgb (1 - dielectricSpecular.r), black, metallic) F 0 = lerp(dieletricSpecular, baseColor.rgb, metallic) α =roughness ^ 2另外,V是到阴影位置的眼矢量,L是从光到阴影位置的矢量,N是与上述值H相同的空间中的表面法线,H是半矢量,其中H =归一化(L + V)样本使用的核心照明方程式是基于物理渲染的廉价BRDF模型的Schlick BRDF模型以下是照明方程中各种术语的常用实现。表面反射率(F)菲涅耳石里克基于 Christophe Schlick的基于物理渲染的廉价BRDF模型简化了菲涅耳的实现。几何遮挡(G)里克基于 Christophe Schlick的基于物理渲染的廉价BRDF模型实现microfacet遮挡。微观分布(D)特罗布里奇 - 瑞兹TS Trowbridge和KP Reitz 从光线反射的粗糙表面的平均不规则表示的平行不规则表示实现microfaced distrubtion弥漫术语(弥漫)兰伯特由Johann Heinrich Lambert 执行Lambert的Photometria漫反射附录C:样条插值glTF中的动画支持三次样条的样条插值。glTF中三次样条的关键帧具有输入和输出值,其中每个输入值对应于三个输出值:in-tangent,spline vertex和out-tangent。给定一组关键帧对于k = 1,...,n, 输入t k并输出入切线a k,顶点v k和出切线b k两个关键帧之间的样条线段以立方Hermite样条曲线表示 p(吨)=(2吨3 - 3吨2 + 1) p 0 +(吨3 - 2吨2 +吨)米 0 +(-2吨3 + 3吨2) p 1 +(吨3 -吨2) m 1哪里 吨是值0和1之间 p 0是在开始顶点吨 = 0 米 0是在起始切线吨 = 0 p 1是在结束顶点吨 = 1 米 1是在结束切线吨 = 1个 p(t)是结果值其中输入偏移t 电流与关键帧索引k 吨 =(吨电流 - 吨ķ)/(吨ķ 1 - 吨ķ) p 0 = v ķ 米 0 =(吨ķ 1 - 吨ķ)b ķ p 1 = v ķ 1 米 1 =(吨k +1 - t k)a k + 1当采样器以节点的旋转属性为目标时,在将结果应用到节点的旋转之前,必须对得到的p(t)四元数进行归一化。实现注意事项:当写出旋转输出值时,出口商应注意不要写出可能导致全部为零的无效四元数的值。这可以通过确保输出值在同一样条中不会同时具有 - q和q来实现。实现注意:第一个入切线a 1和最后一个出切线b n应该为零,因为它们不用于样条计算。
* 声明:本文由其作者或媒体撰写,观点仅代表其本身,不代表本站立场。
编辑
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
 
<< < - > >>
[GIT][*] [HIS][*] [JS][*] [Android][*] [DB][*] [Web][*] [JAVA][*] [C][*] [0][*] [TL][*] [O][*] [3D][*] [PAS][*] [IOS][*] [算法][*] [地球][*] [学习方法][*] [探索][*] [宇宙][*] [Linux][*] [阅读秘诀][*] [考试技巧][*] [...]
天天快乐生活[HappyLifeLife.com]
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士