2017-07-31 128 views
2

我正在使用SceneKit支持正常播放和VR的游戏。当正常播放时,我有一个单一的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" ] 
    ]) 

其中stereoCameraLeftNamestereoCameraRightName在其他地方定义为字符串,并用作节点的名称包含相应的摄像头和视口尺寸仅用于测试。当我将这种技术应用到场景中时,它不起作用,并且根据场景pointOfView的设置,我要么看到充满背景色的完整场景(设置为用于非VR模式的相机的pointOfView,不再链接到场景图)或使用两台相机之一渲染的全尺寸(pointOfView设置为nil),我错过了什么?

更新2:一些试错后,我发现,定义一个简单的通过自定义视正确的方法是这样的,有wh定义为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" ] 
]) 

但有是一个问题:当第二遍渲染时屏幕的左侧保持黑色(清晰的颜色)并且右侧渲染正确,如果我排除此遍只留下第一遍,则左侧正确渲染,右侧按预期与场景背景颜色一起出现。奇怪的是,如果不是在运行iOS 11的iPhone 6上进行测试,而是在模拟器(iOS 11)上进行测试,似乎都可以正常工作,但我相信我错过了将这两个传递相结合的东西。

更新2.1:从第二遍删除blendStates给出了相同的结果。

更新3:试图重新创建MWE以重新创建问题我发现我的方法是正确的,我将尝试调查项目的其他部分以找到问题的位置。

最后更新:的问题似乎是由反锯齿的看法是积极造成的,禁用它使SCNTechnique工作得很好,看起来像iOS的11的错误,我已经提交了一份bug报告。

回答

2

这是试图在多个视图中呈现相同场景的许多问题之一。 (其他则包括性能和并发性。)相反,仅使用单个视图可能是更好的选择,并使用SCNTechnique来呈现视图的场景两次。

当您配置一项技术时,您可以为每个绘制阶段分别设置pointOfView - 如果您要寻找立体声分离,这可能会很方便。

您还可以设置每个过程的viewport。如果您正在进行某种立体渲染,则可以使用此渲染通道覆盖视图的一半,而另一渲染通道覆盖另一半。

+0

谢谢我会研究它,你有任何教程/指南我应该读这个? –

+0

我已经在定义技术方面取得了一些进展,正如你可以在我的问题中看到的那样,我只是使它无法工作的一小步。你有什么想法为什么它不能正常工作? –

+0

关于您的最终更新:提交有关多重采样(反锯齿)的错误。请注意,通过使用技术,您可以控制基于每遍的多重采样,因此问题的一部分可能涉及视图特定和特定通过多重采样设置之间的冲突。 – rickster