GLTFSCN 0.5.2

GLTFSCN 0.5.2

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布上次发布2017年12月

Warren Moore 负责。




GLTFSCN 0.5.2

GLTFKit

一个 Objective-C glTF 2.0 加载器和基于 Metal 的渲染器

A screenshot of a glTF asset rendered with SceneKit

内容

此项目包括几个相关部分

  • GLTF.framework:一个用 Objective-C 编写的 glTF 2.0 加载器框架(适合在 Swift 中使用)
  • GLTFMTL.framework:一个用于使用 Metal 渲染 glTF 资源的框架
  • GLTFSCN.framework:一个将 glTF 场景转换为 SceneKit 场景的框架
  • macOS 上的查看器应用程序
  • macOS 上的 SceneKit 示例应用程序

使用方法

使用框架项目

您可以将 GLTF 和 GLTFMTL 项目添加为您的 Xcode 项目的子项目,或者使用提供的 workspace 构建,然后将生成的框架二进制文件复制到您的项目中。

要使用 GLTF.framework,请将其与 GLTF.framework 链接并嵌入。

要使用提供的 Metal 渲染器,还必须将其与 GLTFMTL 框架链接并嵌入。

加载资产

要加载 glTF 2.0 模型,导入 <GLTF/GLTF.h> 并使用 GLTFAsset

GLTFAsset *asset = [[GLTFAsset alloc] initWithURL:url bufferAllocator:bufferAllocator];

URL 必须是本地文件 URL。不支持加载远程资产和资源。

bufferAllocator 是一个知道如何将 glTF 缓冲区数据加载到其中的内存分配器对象(它必须符合 GLTFBufferAllocator 协议)。要使用提供的 Metal 渲染器渲染资产,您可以传递一个具体类的实例 GLTFMTLBufferAllocator,它是一个特殊的 GLTFBufferAllocator 实现,知道如何分配金属可访问的内存,它可以通过 Metal 读取。要创建这样的分配器,您需要向它提供一个对先前创建的 MTLDevice 对象的引用

id<MTLDevice> device = MTLCreateSystemDefaultDevice();
id<GLTFBufferAllocator> bufferAllocator = [[GLTFMTLBufferAllocator alloc] initWithDevice:device];

渲染资产

创建 Metal 渲染器

要创建 Metal 渲染器,提供您用于创建资产相同的设备

renderer = [[GLTFMTLRenderer alloc] initWithDevice:device];

在渲染器上,您需要配置颜色和深度附件的初始可绘制大小和像素格式,以确保它们与您在渲染通道上配置的纹理匹配。Metal 渲染器当前不支持 MSAA,并且一旦资产被绘制,则无法更改这些像素格式。

如果您正在将内容绘制到 MTKView 中,您可以将渲染器配置为匹配其设置

renderer.drawableSize = mtkView.drawableSize;
renderer.colorPixelFormat = mtkView.colorPixelFormat;
renderer.depthStencilPixelFormat = mtkView.depthStencilPixelFormat;

绘制

渲染器旨在允许将 glTF 资产绘制到与其他 Metal 绘制调用相同的渲染命令编码器(通道)中。

以下是一个创建命令缓冲区和命令编码器以及绘制 glTF 资产的示例

id <MTLCommandBuffer> commandBuffer = [commandQueue commandBuffer];

MTLRenderPassDescriptor *renderPassDescriptor = mtkView.currentRenderPassDescriptor;

id <MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];

// ... additional command encoder configuration and draw calls ...

[renderer renderScene:asset.defaultScene
        commandBuffer:commandBuffer
       commandEncoder:renderEncoder];

// ... additional command encoder configuration and draw calls ...

[renderEncoder endEncoding];

[commandBuffer presentDrawable:mtkView.currentDrawable];

[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> buffer) {
    [renderer signalFrameCompletion];
}];

[commandBuffer commit];

请注意,如果您的 glTF 资产包含透明的网格,则这些网格将按它们在场景图中出现的顺序绘制,因此可能无法与不透明内容或其他内容正确合成。

与 SceneKit 交互

所包含的 GLTFSCN 框架可以用来轻松地将 glTF 资产转换为 SCNScene 集合,以与 SceneKit 互操作。

要获取 glTF 资产中包含的场景集合,请使用 SCNScene 类的扩展方法 +[SCNScene scenesFromGLTFAsset:options:]。由于没有 SceneKit 类型表示场景集合,此方法返回一个场景数组。

以下是一个示例,演示如何加载 GLTF 资产,将其转换为 SceneKit 场景集合,并访问第一个场景

id<GLTFBufferAllocator> bufferAllocator = [[GLTFDefaultBufferAllocator alloc] init];
GLTFAsset *asset = [[GLTFAsset alloc] initWithURL:url bufferAllocator:bufferAllocator];
SCNScene *scene = [[SCNScene scenesFromGLTFAsset:asset options:nil] firstObject];

注意使用 GLTFDefaultBufferAllocator 类型。这是一个分配常规内存而不是 GPU 可访问内存的缓冲区分配器。如果您想使用既兼容 Metal 也兼容 SceneKit 的资产,应使用 GLTFMTLBufferAllocator(如上面所示)。

状态和一致性

以下是 glTF 特性和它们当前支持级别的清单。

状态

编码

  • JSON
  • 二进制 (.glb)

缓冲区存储

  • 外部引用 (buffer.uri)
  • Base-64 编码的缓冲区

众所周知的顶点访问器语义

  • POSITION
  • NORMAL
  • TANGENT
  • TEXCOORD_0
  • TEXCOORD_1
  • COLOR_0
  • JOINTS_0
  • WEIGHTS_0

原语类型

  • 线
  • 线环
  • 线段
  • 三角形
  • 三角形条带
  • 三角形扇

图像

  • 外部图像引用 (image.uri)
  • Base-64 编码的图像
  • PNG
  • JPEG
  • TIFF
  • OpenEXR
  • 辐射

材质

  • 基础颜色系数
  • 金属系数
  • 粗糙度系数
  • 自发光系数
  • 基础颜色图
  • 金属-粗糙度图
  • 遮蔽图
  • 自发光图
  • 法线纹理比例
  • 不透明度模式
    • 不透明度 alpha 模式
    • 遮罩 alpha 模式
    • 混合 alpha 模式
  • 双层材质

采样器

  • 包装模式
  • 缩小/放大过滤器
  • Mipmaps

相机

  • 透视相机
  • 正交相机

变形目标

  • 变形目标

动画

  • 平移动画
  • 旋转动画
  • 缩放动画
  • 形状目标权重动画
  • 线性插值
  • 离散动画
  • 三次样条插值
  • Catmull-Rom 插值

蒙皮

  • 关节矩阵计算
  • 基于 GPU 的顶点蒙皮

稀疏访问器

  • 稀疏访问器

扩展

  • KHR_materials_pbrSpecularGlossiness
  • KHR_materials_common
  • KHR_technique_webgl (没有计划支持
  • KHR_binary_glTF
  • CESIUM_RTC
  • WEB3D_quantized_attributes

一致性

此实现已知不符合 glTF 2.0 规范,目前正在积极开发中。

贡献

由于项目结构和 API 正在迅速变化,此项目目前不接受拉取请求。

许可证

 Copyright (c) 2017 Warren Moore. All rights reserved.

 Permission to use, copy, modify, and distribute this software for any
 purpose with or without fee is hereby granted, provided that the above
 copyright notice and this permission notice appear in all copies.

 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.