Высококачественный рендеринг - RealityKit vs SceneKit vs Metal

Я новичок в разработке приложений для iPhone, хотя имею опыт программирования графики в OpenGL.

Я создаю приложение для iPhone, которое намереваюсь отображать реалистичные / высококачественные рендеры в AR. Пока я экспериментирую с этими тремя вариантами, я все еще не уверен, какой из них мне следует продолжить при разработке фреймворка моего приложения: SceneKit, RealityKit и Metal.

Я читал, что SceneKit построен на основе Metal, но я не уверен, стоит ли тратить время / усилия на программирование каких-либо пользовательских шейдеров, в отличие от использования того, что SceneKit может предложить по умолчанию.

Что касается RealityKit, мне не нужны какие-либо анимации или специальные эффекты, которые он предлагает, только фотореалистичный рендеринг.

В данный момент я программирую на Swift и раньше использовал Objective-C, но не планировал использовать его в своем приложении.

Какой из трех вариантов лучше всего разрабатывать для AR и высококачественного рендеринга моделей?


person rmLuma    schedule 03.03.2020    source источник


Ответы (1)


Обновлено: 20 июня 2021 г.

TL;DR


RealityKit 2.0

введите описание изображения здесь

RealityKit - это самый молодой SDK в семействе технологий рендеринга Apple. Этот высокоуровневый фреймворк был выпущен в 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), который имеет компоненты и может быть создано из ресурсов, таких как ModelEntity. На платформе работает Entity Component System (ECS) на ЦП для управления такими задачами, как физика, анимация, обработка звука и сетевая синхронизация. Но он полагается на оборудование Metal и GPU для выполнения многопоточного рендеринга. В RealityKit есть шесть материалов: UnlitMaterial, SimpleMaterial, PhysicallyBasedMaterial (с 18 полями обзора для управления внешним видом материала), 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)

RealityKit читает файлы в форматах .usdz, .rcproject и .reality. Поддерживает анимацию ресурсов, динамику, материалы PBR, освещение на основе изображений HDR и пространственный звук. Все модели сцены должны быть привязаны к якорям (класс AnchorEntity). Framework автоматически генерирует и использует mipmaps, которые представляют собой серию вариантов текстуры объектов с постепенным уменьшением разрешения. которые улучшают время рендеринга при применении к удаленным объектам. RealityKit работает с многоугольной сеткой, созданной с помощью Реконструкция сцены функция. Я хочу добавить несколько слов о AR Quick Look - фреймворке с нулевыми настройками, который построен на движке RealityKit и предназначен для быстрой визуализации AR.

Заключение. RealityKit предоставляет вам высококачественную технологию рендеринга и современные возможности дополненной реальности прямо из коробки. Поддерживает сканер LiDAR. Поддерживает Photogrammetry инструментов. Воспроизводит поведение Reality Composer через API уведомлений. 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


SceneKit

введите описание изображения здесь

SceneKit также является фреймворком высокого уровня. Самый старый в семействе технологий рендеринга Apple. Он был выпущен в 2012 году. SceneKit был разработан для виртуальной реальности и может работать на iOS / macOS. Для проектов AR вы можете использовать его только вместе с ARKit. SceneKit поддерживает как Objective-C, так и Swift. В SceneKit основным блоком является узел (класс SCNNode), который имеет свою собственную иерархию и может хранить источник света (SCNLight) или < strong> camera (SCNCamera), или геометрию (SCNGeometry), или систему частиц (SCNParticleSystem), или аудиоплееры (SCNAudioPlayer). Основное преимущество SceneKit - он легко настраивается, он может изменять геометрию и материалы во время выполнения, имеет морферы, скинов и ограничений, он отображает сцену со скоростью до 120 кадров в секунду и имеет расширенная настройка для системы частиц. Существуют шейдеры Blinn, Constant, Lambert, Phong, ShadowOnly и PBR.

Occlusion шейдер также доступен для нас в SceneKit, но в настраиваемой форме (здесь нет готового материала для окклюзии, который мы можем найти в RealityKit). Если вам нужен видеоматериал в SCNScene, вы должны реализовать SpriteKit SKVideoNode.

Также мы можем использовать SCNProgram object для выполнения пользовательского рендеринга. Это полная программа шейдера Metal или OpenGL, которая заменяет рендеринг материала или даже геометрии в SceneKit. Надежным помощником SceneKit является библиотека ввода-вывода модели, которая выполняет импорт, экспорт и манипулирование моделями. с использованием общей инфраструктуры.

Образец кода:

 
@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)

SceneKit читает файлы в форматах .usdz, .dae и .scn. Поддерживает вложенную анимацию ресурсов, динамику, частицы, материалы PBR, HDR IBL и пространственный звук. Для неявной и явной анимации преобразования любого узла вы можете использовать SCNAction, SCNTransaction и классы CAAnimation. Хотя настройка столкновений в SceneKit немного сложна. Чтобы создать модульную и масштабируемую игровую архитектуру с помощью SceneKit, нам необходимо реализовать < strong> entity-component шаблон.

Заключение: SceneKit предоставляет вам высококачественную технологию рендеринга (но сначала вам нужно настроить physicallyBased шейдер), хотя для проектов AR вы можете использовать его только с ARKit. SceneKit обладает широкими возможностями настройки и может использоваться с Swift и Objective-C, а также предоставляет вам набор полезных renderer(...) методов экземпляра, поступающих из Протокол ARSCNViewDelegate, который позволяет обновлять модели AR и отслеживаемые якоря со скоростью 60 кадров в секунду. Работает с UIKit и SwiftUI (несмотря на то, что в Xcode нет шаблона SceneKit+SwiftUI). Есть очевидные причины, по которым 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 


Металл и MetalKit

введите описание изображения здесь

Если быть точным, Metal - это не технология рендеринга, а ускоритель графического процессора. Выпущен в 2014 году. Это низкоуровневый фреймворк. Metal реализован повсюду - в RealityKit, SceneKit, ARKit, CoreML, Vision, AVFoundation и т. Д. Metal объединяет функции, аналогичные OpenGL и OpenCL, под капотом всего одного API. Конечно, Metal можно использовать в качестве средства рендеринга для продвинутой 3D-графики.

Согласно документации Apple: Metal - это язык программирования на основе C ++, который разработчики могут использовать для написания кода, который выполняется на графическом процессоре для графики и универсальных параллельных вычислений с данными. Поскольку Metal основан на C ++, разработчики найдут его знакомым и простым в использовании. С помощью Metal как графические, так и вычислительные программы могут быть написаны на едином унифицированном языке, что обеспечивает более тесную интеграцию между ними.

В дополнение к Metal вы можете использовать модуль MetalKit (выпущен в 2015 году), который помогает создавать приложения Metal быстрее и проще, используя гораздо меньше кода. Он отображает графику в стандартном металлическом представлении, загружает текстуры из многих источников и эффективно работает с моделями, предоставленными фреймворком Model I / O.

Металл начинает сиять, когда вы визуализируете значительно большее количество полигонов или 3D-частиц, чем SceneKit способен визуализировать.

Образец кода:


import MetalKit
    
class RedCube: Primitive {
        
    override func buildVertices() {
            
        vertices = [ 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 framework для создания высококачественной визуализации графического процессора для игр со сложной трехмерной средой, для приложений обработки видео, таких как Final Cut Pro и Nuke, для трехмерных приложений, таких как Maya, или для больших данных. научные приложения, которые должны работать для научных исследований. Учтите, что трассировка лучей в 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 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

Если вам нужна дополнительная информация об ARKit и его возможностях, прочтите ЭТО ЗАПИСЬ.

person Andy Fedoroff    schedule 03.03.2020
comment
Отличный ответ! Я использую SceneKit в основном для создания нестандартной геометрии. К сожалению, функции LiDAR недоступны для SceneKit. Также интересно, какую роль SceneKit будет играть в будущем ... - person Peter Pohlmann; 15.11.2020
comment
Большое спасибо, Энди, за подробный ответ. - person Alexandre Camilleri; 24.03.2021
comment
@PeterPohlmann, похоже, LiDAR в какой-то степени доступен в Scenekit. например вы можете использовать arSceneView.session.run(configuration), где конфигурация имеет тип ARWorldTrackingConfiguration, который может configuration.sceneReconstruction = .meshWithClassification - person grantespo; 26.05.2021