rmL*_*uma 32 scenekit swift metal arkit realitykit
我正在创建一个 iOS 应用程序,我打算在 AR 中显示逼真/高质量的渲染。在试验这 3 个选项的同时,我仍然不确定我应该继续开发我的应用程序框架中的哪一个:SceneKit、RealityKit和Metal。
我读过 SceneKit 是建立在 Metal 之上的,但我不确定是否值得花时间/精力对任何自定义着色器进行编程,而不是使用 SceneKit 默认提供的功能。关于 RealityKit,我不需要它提供的任何动画或特殊效果,只需要照片级渲染方面。
三者中哪一个最适合开发 AR 和高质量模型渲染?
ARG*_*Geo 102
更新时间:2021 年 8 月 30 日。
RealityKit 2.0
RealityKit 是 Apple 渲染技术家族中最年轻的 SDK。该高级框架于 2019 年发布。 RealityKit 专为 AR / VR 项目而设计,简化了多用户体验的设置,可在 iOS / macOS 上使用。执行多线程渲染。
没有 Objective-C 的遗产,RealityKit 只支持 Swift 和声明式语法(就像在 SwiftUI 中一样)。RealityKit 的主要优势——它可以补充/更改/自定义来自 Reality Composer 应用程序的场景,并且可以成为 ARKit 的强大扩展——尽管它作为独立的 AR SDK 也很出色。在 RealityKit 中,主要单元是具有组件并可从资源创建的实体(ModelEntity、AnchorEntity、TriggerVolume、BodyTrackedEntity、PointLight、SpotLight、DirectionalLight和PerspectiveCamera)像模型实体。该框架在 CPU 上运行实体组件系统(ECS),以管理物理、动画、音频处理和网络同步等任务。但它依赖于 Metal 和 GPU 硬件来执行多线程渲染。RealityKit 有六种材质:UnlitMaterial、SimpleMaterial、PhysicallyBasedMaterial(有 18 个 AOV 用于控制材质的外观)、OcclusionMaterial,VideoMaterial当然还有CustomMaterial.
请特别注意 iOS 上的阴影——最高为 A11 芯片组的设备会产生投影(又称深度图)阴影,但在配备 A12 及更高版本的设备上,我们可以看到光线追踪阴影。也许你在这种情况下的解决方案可能是假阴影。RealityKit 中On的许多现代渲染功能都是默认的:相机的景深、面部/人物遮挡、接地阴影、运动模糊、相机颗粒等。
示例代码:
@IBOutlet weak var arView: ARView!
let box = MeshResource.generateBox(size: 0.5)
let material = PhysicallyBasedMaterial()
let model = ModelEntity(mesh: box, materials: [material])
let anchor = AnchorEntity(world: [0, 0,-1])
anchor.addChild(model)
arView.scene.anchors.append(anchor)
Run Code Online (Sandbox Code Playgroud)
RealityKit 读取.usdz,.rcproject和.reality文件格式。支持资产动画、动态、PBR 材料、基于 HDR 图像的照明和空间音频。所有场景模型都必须与锚点(AnchorEntity 类)相连。框架会自动生成并使用mipmaps,这是一系列逐渐降低分辨率的对象纹理变体,可在应用于远距离对象时提高渲染时间。RealityKit 使用场景重建功能生成的多边形网格。我想补充几句AR Quick Look- 一个基于 RealityKit 引擎构建的零设置框架,它是为快速 AR 可视化而设计的。
结论:RealityKit 为您提供开箱即用的高质量渲染技术和最新的 AR 功能。支持激光雷达扫描仪。支持Photogrammetry工具。通过其通知 API 播放 Reality Composer 的行为。RealityKit 可以作为独立框架使用,也可以作为 ARKit 和 MetalKit 的合作伙伴。从 iOS 15 开始,我们可以访问fragment/pixel shaders并geometry modifiers通过 Metal 脚本和 CustomMaterials。
RealityKit 适用于 UIKit 故事板或 SwiftUI 界面。它至少有一个样板代码。例如,RealityKit 有一个非常简单的模型碰撞和手势设置(平移、旋转、捏合)。并且有组合而不是继承,所以它更像是一个面向协议的编程框架——tight coupling在大多数情况下,在你的代码中不再是一个问题。RealityKit 与Combine反应式范式完美契合,后者有助于处理发布者、订阅者和异步事件。
RealityKit 的原生视图是 ARView。
@available(OSX 10.15, iOS 13.0, *)
@objc open class ARView : ARViewBase
Run Code Online (Sandbox Code Playgroud)
场景套件
SceneKit 也是一个高级框架。Apple 渲染技术家族中最古老的一种。它于 2012 年发布。 SceneKit 是为 VR 设计的,可以在 iOS / macOS 上运行。对于 AR 项目,您只能将它与 ARKit 结合使用。SceneKit 支持 Objective-C 和 Swift。在 SceneKit 中,主要单元是一个节点(SCNNode 类),它有自己的层次结构,可以存储灯光(SCNLight)、相机(SCNCamera)、几何图形(SCNGeometry)、粒子系统(SCNParticleSystem)或音频播放器(SCNAudioPlayer)。SceneKit 的主要优点 - 它是高度可定制的,它可以在运行时改变几何体和材料,它具有变形器、蒙皮器和约束,它可以渲染高达 120 fps 的场景,并且具有粒子系统的高级设置。有Blinn,Constant,Lambert,Phong,ShadowOnly和PBR着色器。
Occlusion我们也可以在 SceneKit 中使用着色器,但采用自定义形式(这里没有像我们在 RealityKit 中可以找到的那样开箱即用的遮挡材料)。如果您需要 SCNScene 中的视频素材,您应该实现 SpriteKit 的SKVideoNode.
我们也可以使用 anSCNProgram object来执行自定义渲染。它是一个完整的 Metal 或 OpenGL 着色器程序,可替代 SceneKit 对材质甚至几何体的渲染。SceneKit 的可靠伴侣是模型 I/O库,它使用通用基础结构执行导入、导出和模型操作。
示例代码:
@IBOutlet weak var sceneView: SCNView!
sceneView.scene = SCNScene()
sceneView.autoenablesDefaultLighting = true
let boxNode = SCNNode()
boxNode.geometry = SCNBox(width: 0.5, height: 0.5, length: 0.5, chamferRadius: 0)
boxNode.geometry?.firstMaterial?.lightingModel = .physicallyBased
boxNode.geometry?.firstMaterial?.diffuse.contents = UIColor.red
boxNode.geometry?.firstMaterial?.metalness.contents = 1.0
sceneView.scene?.rootNode.addChildNode(boxNode)
Run Code Online (Sandbox Code Playgroud)
SceneKit 读取.usdz,.dae和.scn文件格式。支持嵌套资产动画、动力学、粒子、PBR 材质、HDR IBL 和空间音频。对于任何节点的隐式和显式转换动画,您可以使用SCNAction、SCNTransaction和CAAnimation类。尽管SceneKit 中的碰撞设置有点复杂。要使用 SceneKit 创建模块化和可扩展的游戏架构,我们需要实现GameplayKit的实体组件模式。
结论:SceneKit 为您提供了高质量的渲染技术(但首先您需要设置physicallyBased着色器),尽管对于 AR 项目,您只能将它与 ARKit 一起使用。SceneKit 是高度可定制的,可以与 Swift 和 Objective-C 一起使用,它为您提供了一组renderer(...)来自ARSCNViewDelegate协议的有用实例方法,允许您以 60 fps 的速度更新 AR 模型和跟踪锚点。适用于 UIKit 和 SwiftUI(尽管SceneKit+SwiftUIXcode 中没有模板)。Apple 可能会在接下来的 3 年内弃用此框架的原因很明显——SceneKit 自 2017 年以来一直没有更新(不包括像clearCoat材质属性这样的小改动)。但是 SceneKit 还是有几个基本的优势 超过 RealityKit 2.0。
SceneKit 的原生视图是 SCNView。
@available(iOS 8.0, tvOS 9.0, *)
open class SCNView : UIView, SCNSceneRenderer, SCNTechniqueSupport
@available(OSX 10.8, *)
open class SCNView : NSView, SCNSceneRenderer, SCNTechniqueSupport
Run Code Online (Sandbox Code Playgroud)
金属和金属套件
准确地说,Metal 不是渲染技术,而是具有使用丰富着色语言能力的 GPU 加速器。它于 2014 年发布。它是一个低级框架。Metal 无处不在——在 RealityKit、SceneKit、ARKit、CoreML、Vision、AVFoundation 等中。Metal 在一个 API 的引擎盖下结合了类似于 OpenGL 和 OpenCL 的功能。当然,Metal 可以用作高级 3D 图形的渲染器。金属不仅渲染反射,还渲染折射和次表面散射现象。
根据 Apple 文档:“Metal 是一种基于 C++ 的编程语言,开发人员可以使用它来编写在 GPU 上执行的用于图形和通用数据并行计算的代码。由于 Metal 基于 C++,开发人员会发现它熟悉且易于使用。使用 Metal,图形和计算程序都可以用单一、统一的语言编写,这允许两者之间更紧密地集成。 ”
除了 Metal 之外,您还可以使用MetalKit模块(2015 年发布)帮助更快、更轻松地构建 Metal 应用程序,使用更少的代码。它在标准的 Metal 视图中渲染图形,从许多来源加载纹理,并与 Model I/O 框架提供的模型高效工作。
当您渲染的多边形或 3D 粒子数量比 SceneKit 或 RealityKit 能够渲染的数量多得多时,金属开始发光。
当您知道 Metal 不仅可以在 Apple 生态系统中使用,而且可以在 Windows 中使用时,您会感到惊讶。这是一个链接,您可以在其中下载Metal Developer Tools for Windows。
示例代码:
import MetalKit
class RedCube: Primitive {
override func buildVertices() {
vrtx = [ Vertex(position: float3(-1, 1, 1), color: float4(1,0,0,1)),
Vertex(position: float3(-1,-1, 1), color: float4(1,0,0,1)),
Vertex(position: float3( 1, 1, 1), color: float4(1,0,0,1)),
Vertex(position: float3( 1,-1, 1), color: float4(1,0,0,1)),
Vertex(position: float3(-1, 1,-1), color: float4(1,0,0,1)),
Vertex(position: float3( 1, 1,-1), color: float4(1,0,0,1)),
Vertex(position: float3(-1,-1,-1), color: float4(1,0,0,1)),
Vertex(position: float3( 1,-1,-1), color: float4(1,0,0,1)) ]
indices = [ 0,1,2, 2,1,3, 5,2,3,
5,3,7, 0,2,4, 2,5,4,
0,1,4, 4,1,6, 5,4,6,
5,6,7, 3,1,6, 3,6,7 ]
}
}
Run Code Online (Sandbox Code Playgroud)
...
class CubeScene: Scene {
override init(device: MTLDevice) {
super.init(device: device)
let redCube = RedCube(withDevice: device)
objects.append(redCube)
redCube.translate(direction: float3(0,0,-10))
add(child: redCube)
}
override func render(commandEncoder: MTLRenderCommandEncoder,
deltaTime: Float) {
objects.forEach { $0.rotate(angle: deltaTime,
axis: float3(1, 1,-1)) }
super.render(commandEncoder: commandEncoder,
deltaTime: deltaTime)
}
}
Run Code Online (Sandbox Code Playgroud)
结论:开发人员通常使用 Metal 框架为具有复杂 3D 环境的游戏、Final Cut Pro 和 Nuke 等视频处理应用程序、Maya 等 3D 应用程序或必须执行科学的大数据科学应用程序生成高质量的 GPU 渲染。研究。考虑一下,Metal 中的光线追踪比 RealityKit 快得多。
MetalKit 的原生视图是 MTKView。
@available(iOS 9.0, tvOS 9.0, *)
open class MTKView : UIView, NSCoding, CALayerDelegate
@available(OSX 10.11, *)
open class MTKView : NSView, NSCoding, CALayerDelegate
Run Code Online (Sandbox Code Playgroud)
精灵套件
SpriteKit 是基于 Apple 节点的框架,用于创建和渲染 2D 游戏和 2D 图形。于 2013 年发布。您可以将 SpriteKit 作为独立 API 使用,也可以与 SceneKit 和 ARKit 一起使用。它的主要特点是能够用物理、2D 文本和形状、图像和视频绘制精灵。在 SpriteKit 中,您可以使用 Objective-C 或 Swift 编写代码。
官方文档:“SpriteKit 是一个通用的 2D 框架,它利用 Metal 实现高性能渲染,同时提供简单的编程接口,可以轻松创建游戏和其他图形密集型应用程序。使用丰富的动画和物理集行为,您可以快速为您的视觉元素增添活力,并在屏幕之间优雅地过渡”。
SpriteKit 使用两种继承自 UIView 和 NSView 的原生视图类型:
@available(iOS 7.0, tvOS 9.0, *)
open class SKView : UIView
@available(OSX 10.9, *)
open class SKView : NSView
Run Code Online (Sandbox Code Playgroud)
ARKit 5.0
ARKit 内部没有任何渲染引擎。该模块只负责高质量World Tracking和Scene Understanding(平面检测、光线投射、场景重建和光估计)。但是,ARKit 能够处理Canonical Facial Meshes(ARFaceGeometry类)或Vertices, Normals, Triangular Faces, and Classifications重建几何(ARMeshGeometry类)的数据。
以下是 ARKit 能够使用的四种视图类型:ARSCNView、ARSKView、ARView 和 MTKView。
@available(iOS 11.0, *)
open class ARSCNView : SCNView, ARSessionProviding
@available(iOS 11.0, *)
open class ARSKView : SKView, ARSessionProviding
@available(iOS 13.0, *)
@objc open class ARView : ARViewBase
@available(iOS 9.0, *)
open class MTKView : UIView, NSCoding, CALayerDelegate
Run Code Online (Sandbox Code Playgroud)
如果您需要有关 ARKit 及其功能的其他信息,请阅读这篇文章。
| 归档时间: |
|
| 查看次数: |
12622 次 |
| 最近记录: |