Для тех, кто ищет аудио-видео решение — заходите сюда. Для TLDR сразу перейдите к решению.

Привет, я новенький…

ARKit содержит функцию под названием «Snapshot()», которая преобразует вид на экране в изображение, которое можно просмотреть/сохранить.

Однако он имеет свои ограничения.

Проблема

Основанные на времени шейдеры, рассчитанные графическим процессором, такие как подробно описанный ниже и показанный здесь, не могут быть захвачены функцией моментального снимка.

Видео ниже снято с помощью ReplayKit (учебник здесь). Это не стабильное решение — этот есть.

Теория

Давайте посмотрим на код

Хотя эффект работает волшебным образом, ошибка возникает из-за того, что системе необходимо выполнять множество вычислений на уровне графического процессора (строки 90–112).

Вместо этого мы должны записывать переменную в материал каждый раз при рендеринге сцены, что позволяет мгновенно указать, какие переменные показывать, а какие нет.

Решение

Металлическая половина

Быстрая половина

Обновите шейдер во время выполнения — после его рендеринга — что позволит вам безопасно сделать снимок. Обратите внимание, что это может значительно снизить частоту кадров при записи.

func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
    for child in (YOUR_NODE)! {
    let shaderMaterial:SCNMaterial = (child.geometry?.firstMaterial)!;
    var displayVariables:DisplayVariableStruct = DisplayVariableStruct(show: YOUR_VALUE)
    shaderMaterial.setValue(Data(bytes: &displayVariables, count: MemoryLayout<DisplayVariableStruct>.stride), forKey: "displayVariables");
}
}

Пожалуйста, оставляйте любые комментарии или вопросы в разделе ниже.

O