高质量渲染——RealityKit vs SceneKit vs Metal

Posted

技术标签:

【中文标题】高质量渲染——RealityKit vs SceneKit vs Metal【英文标题】:High-Quality Rendering – RealityKit vs SceneKit vs Metal 【发布时间】:2020-06-15 17:55:58 【问题描述】:

我正在创建一个打算在 AR 中显示逼真/高质量渲染的 ios 应用。在尝试这 3 个选项时,我仍然不确定我应该继续围绕其中的哪一个来开发我的应用程序框架:SceneKitRealityKit金属

我读到 SceneKit 是基于 Metal 构建的,但我不确定它是否值得花时间/精力编写任何自定义着色器,而不是使用 SceneKit 默认提供的。关于 RealityKit,我不需要它提供的任何动画或特殊效果,只需要逼真的渲染方面。

三者中哪一个最适合开发用于 AR 和高质量模型渲染

【问题讨论】:

【参考方案1】:

更新:2022 年 2 月 26 日。

TL;DR

RealityKit 2.0

RealityKit 是 Apple 渲染技术家族中最年轻的 SDK。这个高级框架于 2019 年发布。RealityKit 专为 AR / VR 项目而设计,简化了多用户体验设置,可在 iOS / macOS 上使用。执行multithreaded 渲染。

没有 Objective-C 的遗留,RealityKit 仅支持 Swift,并且支持声明式语法(就像在 SwiftUI 中一样)。 RealityKit 的主要优势——它可以补充/更改/自定义来自 Reality Composer 应用程序的场景,并且可以成为 ARKit 的强大扩展——尽管它也可以作为独立的 AR SDK 闪耀。在 RealityKit 中,主要的单位是 entitiesModelEntityAnchorEntityTriggerVolumeBodyTrackedEntityPointLightSpotLightDirectionalLightPerspectiveCamera)具有组件并且可以从 resources 如 ModelEntity 创建。该框架在 CPU 上运行Entity Component System (ECS) 来管理物理、动画、音频处理和网络同步等任务。但它依赖于 Metal 和 GPU 硬件来执行多线程渲染。 RealityKit 有六种材质:UnlitMaterialSimpleMaterialPhysicallyBasedMaterial(具有 18 个用于控制材质外观的 AOV)、OcclusionMaterialVideoMaterial,当然还有CustomMaterial。

要特别注意 iOS 上的阴影 - 最高 A11 芯片组的设备会产生投影(也称为深度图)阴影,但在 A12 及更高版本的设备上,我们可以看到光线追踪阴影。在这种情况下,您的解决方案可能是fake shadows。 RealityKit 中的许多当代渲染功能默认为On:相机的景深、面部/人物遮挡、背景阴影、运动模糊、相机颗粒等。

Swift 中的示例代码:

@IBOutlet weak var arView: ARView!

let box = MeshResource.generateBox(size: 0.5)
var material = PhysicallyBasedMaterial()
let model = ModelEntity(mesh: box, materials: [material])
    
let anchor = AnchorEntity(world: [0, 0,-1])
anchor.addChild(model)

arView.scene.anchors.append(anchor)

RealityKit 读取.usdz.rcproject.reality 文件格式。支持资产动画、动态、PBR 材质、基于 HDR 图像的照明和空间音频。所有场景模型都必须与anchors(AnchorEntity 类)绑定。框架自动生成和使用mipmaps,这是一系列逐渐降低对象纹理的变体,可在应用于远处对象时缩短渲染时间。 RealityKit 使用使用Scene Reconstruction 功能生成的多边形网格。我想补充几句关于 AR Quick Look 的内容 - 一个基于 RealityKit 引擎构建的零设置框架,旨在实现快速 AR 可视化。

结论:RealityKit 为您提供开箱即用的高质量渲染技术和最新的 AR 功能。支持激光雷达扫描仪。支持Photogrammetry 工具。通过其通知 API 播放 Reality Composer 的行为。 RealityKit 可以作为独立框架使用,也可以作为 ARKit 和 MetalKit 的合作伙伴。从 iOS 15 开始,我们可以通过 Metal 脚本和 CustomMaterials 访问 fragment/pixel shadersgeometry modifiers

RealityKit 可与 UIKit 故事板或 SwiftUI 界面一起使用。它至少有一个样板代码。例如,RealityKit 为models' collision 和手势(平移、旋转、捏合)提供了非常简单的设置。并且组合优于继承,因此它是一个面向协议的编程框架——tight coupling 在大多数情况下不再是您的代码中的问题。 RealityKit 非常适合 Combine 响应式范例,它有助于处理发布者、订阅者和异步事件。

RealityKit 的原生视图是 ARView。

@available(OSX 10.15, iOS 13.0, *)
@objc open class ARView : ARViewBase

场景工具包

SceneKit 也是一个高级框架。 Apple 渲染技术家族中最古老的一种。它于 2012 年发布。SceneKit 是为 VR 设计的,可以在 iOS / macOS 上运行。对于 AR 项目,您只能将其与 ARKit 结合使用。 SceneKit 支持 Objective-C 和 Swift。在 SceneKit 中,主要单元是一个 nodeSCNNode 类),它有自己的层次结构,可以存储一个 light(SCNLight),或者一个 相机 (SCNCamera),或几何 (SCNGeometry),或粒子系统 (SCNParticleSystem),或音频播放器 (SCNAudioPlayer)。 SceneKit 的主要优点 - 它是高度可定制的,它可以在运行时更改几何体和材质,它有 morphers、skinners 和 constraints,它可以渲染高达 120 fps 的场景,并且它具有粒子系统的高级设置。有BlinnConstantLambertPhongShadowOnlyPBR着色器。

Occlusion 着色器在 SceneKit 中也可供我们使用,但以自定义形式(这里没有我们在 RealityKit 中可以找到的开箱即用的遮挡材料)。如果你需要 SCNScene 中的视频素材,你应该实现 SpriteKit 的SKVideoNode

我们也可以使用SCNProgram object 来执行自定义渲染。它是一个完整的 Metal 或 OpenGL 着色器程序,可替代 SceneKit 对材质甚至几何体的渲染。 SceneKit 的可靠伙伴是 Model I/O 库,它使用通用基础架构执行导入、导出和模型操作。

Objective-C 中的示例代码:

SCNView *sceneView = (SCNView *)self.view;
SCNScene *scene = [SCNScene scene];
    
sceneView.scene = scene;
sceneView.autoenablesDefaultLighting = YES;
sceneView.allowsCameraControl = YES;
    
SCNNode *box = [SCNNode node];
box.geometry = [SCNBox boxWithWidth:0.5 height:0.5 length:0.5 chamferRadius:0];
box.geometry.firstMaterial.lightingModelName = SCNLightingModelPhysicallyBased;
box.geometry.materials[0].diffuse.contents = [UIColor systemRedColor];
box.geometry.materials.firstObject.metalness.contents = @1.0;
[scene.rootNode addChildNode:box];

SceneKit 读取.usdz.dae.scn 文件格式。支持嵌套资产动画、动力学、粒子、PBR 材质、HDR IBL 和spatial audio。对于任何节点的隐式和显式变换动画,您可以使用SCNAction、SCNTransaction 和CAAnimation 类。虽然 SceneKit 中的 collisions' setup 有点复杂。要使用 SceneKit 创建模块化和可扩展的游戏架构,我们需要实现 GameplayKit 的 entity-component 模式。

结论:SceneKit 为您提供了高质量的渲染技术(但首先您需要设置physicallyBased 着色器),尽管对于 AR 项目您只能将其与 ARKit 一起使用。 SceneKit 是高度可定制的,可以与 Swift 和 Objective-C 一起使用,它为您提供了一组来自ARSCNViewDelegate 协议的有用的renderer(...) 实例方法,允许您以 60 fps 的速度更新 AR 模型和跟踪锚点。适用于 UIKit 和 SwiftUI(尽管 Xcode 中没有 SceneKit+SwiftUI 模板)。 Apple 可能会在未来 3 年内弃用此框架有明显的原因——SceneKit 自 2017 年以来一直没有更新(不包括细微的更改,例如 clearCoat material 属性)。但 SceneKit 仍然有 several basic advantages 超过 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 

金属和金属套件

确切地说,Metal 不是一种渲染技术,而是具有使用丰富着色语言 (MSL) 能力的 GPU 加速器。它于 2014 年发布。它是一个低级框架。 Metal 无处不在——在 RealityKit、SceneKit、ARKit、CoreML、Vision、AVFoundation 等中。Metal 在一个 API 的底层结合了类似于 OpenGL 和 OpenCL 的功能。当然,Metal 可以用作高级 3D 图形的渲染器。金属不仅会渲染反射,还会渲染refractions 和subsurface scattering 现象。

根据 Apple 文档“Metal 是一种基于 C++ 的编程语言,开发人员可以使用它编写在 GPU 上执行的代码,用于图形和通用数据并行计算。由于 Metal 基于 C++,开发人员会发现它熟悉且易于使用。使用 Metal,图形和计算程序都可以用一种统一的语言编写,从而可以更紧密地集成两者。"

除了 Metal 之外,您还可以使用 MetalKit 模块(于 2015 年发布),它有助于更​​快、更轻松地构建 Metal 应用程序,使用更少的代码。它在标准的 Metal 视图中渲染图形,从多个来源加载纹理,并与 Model I/O 框架提供的模型高效工作。

当您渲染比 SceneKit 或 RealityKit 能够渲染的多得多的多边形或 3D 粒子时,金属开始发光。

当您知道 Metal 不仅可以在 Apple 生态系统中使用,还可以在 Windows 中使用时,您会感到惊讶。这是link,您可以在其中下载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 ]
    

...


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)
    

结论:开发人员通常使用 Metal 框架为具有复杂 3D 环境的游戏、Final Cut Pro 和 Nuke 等视频处理应用程序、Maya 等 3D 应用程序或用于科学研究必须执行的大数据科学应用程序。考虑一下,raytracing in 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

SpriteKit

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

ARKit 5.0

ARKit 内部没有任何渲染引擎。该模块只负责高质量的World TrackingScene Understanding(平面检测、光线投射、场景重建和光照估计)。然而,ARKit 能够处理Canonical Facial MeshesARFaceGeometry 类)或重构几何体(ARMeshGeometry 类)的Vertices, Normals, Triangular Faces, and Classifications 的数据。

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

如果您需要有关 ARKit 及其功能的更多信息,请阅读THIS POST。

【讨论】:

这是一个很好的答案!我主要使用 SceneKit 来创建自定义几何体。遗憾的是,LiDAR 功能不适用于 SceneKit。也想知道 SceneKit 将来会扮演什么角色...... 非常感谢安迪的详细回答。 @PeterPohlmann 似乎 LiDAR 的东西在某种程度上可以在 scenekit 中使用。例如您可以使用arSceneView.session.run(configuration),其中配置类型为ARWorldTrackingConfiguration,可以configuration.sceneReconstruction = .meshWithClassification 超级简洁的答案!

以上是关于高质量渲染——RealityKit vs SceneKit vs Metal的主要内容,如果未能解决你的问题,请参考以下文章

RealityKit - 隐藏和显示 usdz 模型的部分(网格)

如何在运行时将 3D 内容加载到 RealityKit 应用程序中?

VS2022编译freetype库

ARKit 或 RealityKit——我们如何检测真实世界的物体?

如何在realitykit中显示来自画廊的图像?

有没有办法在 RealityKit 中将视图呈现为实体?