Для тех, кто ищет аудио-видео решение — заходите сюда. Для 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