Многочисленная ошибка аудио 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 за каждый проход. Если вы выполняете какой-либо стерео рендеринг, вы бы использовали это, чтобы один проход рендеринга покрывал одну половину вида, а другой проход рендеринга покрывал другую половину.

Другие вопросы по тегам