Многочисленная ошибка аудио SCNView
Я работаю над игрой, которая поддерживает как нормальную игру, так и виртуальную реальность с использованием SceneKit. При нормальной игре у меня один SCNView
одна камера, которая также соответствует виду аудио слушателя. При переходе в режим VR я разделил экран на два SCNView
обе воспроизводят одну и ту же сцену с двух разных камер с аудио слушателем, расположенным между ними, здесь нет проблем.
В моей игре мне нужно позиционное аудио, поэтому я использую SCNAudioSuorce
чтобы воспроизвести звуковой эффект, используя SCNAction
но так как одна и та же сцена воспроизводится в обоих режимах, как я могу отключить звук одного из них и получить звук только от другого? Я искал в Интернете и документации, но ничего не нашел по этому поводу.
Обновление iOS 11: после тестирования моего приложения на iOS 11 и попытки воспроизвести звук в режиме VR, происходит сбой приложения в потоке очереди рендеринга в __UpdateAudioTransform
потому что я играю этот звук, удаление его из действия (которое включает в себя трансформации других узлов) делает игру нормальной.
Обновление 1: благодаря совету @rickster я попытался реализовать SCNTechnique
и следуя документации Apple, я получил это
SCNTechnique(dictionary: [
"passes" : [
"leftView": [
"draw": "DRAW_SCENE",
"pointOfView": stereoCameraLeftName,
"viewport": "(0, 0, 400, 400)"
],
"rightView": [
"draw": "DRAW_SCENE",
"pointOfView": stereoCameraRightName,
"viewport": "(200, 0, 400, 400)"
]
],
"sequence": [ "leftView", "rightView" ]
])
где stereoCameraLeftName
а также stereoCameraRightName
в другом месте определяются как строки и используются в качестве имен узлов, содержащих соответствующие камеры, а размеры области просмотра предназначены только для тестирования. Когда я применяю эту технику к сцене, она не работает и в зависимости от того, как сцена pointOfView
Я либо вижу полную сцену, заполненную цветом фона (pointOfView
установить камеру, используемую в режиме без VR, больше не связанную с графиком сцены) или в полноразмерном формате, отображаемом с помощью одной из двух камер (pointOfView
установлен в nil
) что мне не хватает?
Обновление 2: после некоторого следа и ошибки я обнаружил, что правильный способ определения простого прохода для пользовательского видового экрана выглядит следующим образом: w
а также h
определяется как CGFloat
:
let technique = SCNTechnique(dictionary: [
"passes" : [
"leftView": [
"outputs": [ "color": "COLOR" ],
"draw": "DRAW_SCENE",
"colorStates": [
"clear": true,
"clearColor": "sceneBackground"
],
"pointOfView": stereoCameraLeftName,
"viewport": "0 0 \(w) \(h)"
],
"rightView": [
"outputs": [ "color": "COLOR" ],
"draw": "DRAW_SCENE",
"colorStates": [
"clear": false
],
"pointOfView": stereoCameraRightName,
"viewport": "\(w) 0 \(w) \(h)",
"blendStates": [
"colorOp": "add",
"alphaOp": "add"
]
]
],
"sequence": [ "leftView", "rightView" ]
])
Но есть проблема: когда отображается второй проход, левая сторона экрана остается черной (чистый цвет), а правая сторона отображается правильно, если я исключаю этот проход, оставляя только первый, левая сторона отображается правильно, а Правая сторона появляется с цветом фона сцены, как и ожидалось. Странно то, что если вместо тестирования на моем iPhone 6s под управлением iOS 11 я тестирую на симуляторе (iOS 11), то все, кажется, работает нормально, я уверен, что что-то упускает при объединении двух проходов.
Обновление 2.1: удаление blendStates
со второго прохода дает те же результаты.
Обновление 3: пытаясь воссоздать MWE, чтобы воссоздать проблему, я обнаружил, что мой подход верен, я попытаюсь исследовать другие части своих проектов, чтобы выяснить, в чем проблема.
Окончательное обновление: проблемы, по-видимому, вызваны активным сглаживанием в представлении, отключение которого делает SCNTechnique
работает нормально, похоже на ошибку iOS 11, и я уже подал отчет об ошибке.
1 ответ
Это одна из многих проблем, возникающих при попытке отобразить одну и ту же сцену в нескольких представлениях. (Другие включают производительность и параллелизм.) Вместо этого, вероятно, лучше использовать только одно представление и использовать SCNTechnique
визуализировать сцену дважды в ней.
Когда вы настраиваете технику, вы можете установить pointOfView
отдельно для каждого прохода розыгрыша - это, вероятно, было бы удобно, если вы ищете стерео разделение
Вы также можете установить viewport
за каждый проход. Если вы выполняете какой-либо стерео рендеринг, вы бы использовали это, чтобы один проход рендеринга покрывал одну половину вида, а другой проход рендеринга покрывал другую половину.