iPhone X 上使用 SceneKit 和 SpriteKit 叠加时出现像素格式错误

4
我在iPhone X (iOS 11.1.2)上使用Metal渲染器运行SceneKit应用程序时遇到了问题。该应用程序具有plist密钥SCNDisableLinearSpaceRendering,设置为YES以获得与iOS 9及更高版本相同的颜色渲染。还通过overlaySKScene添加了SpriteKit 2D叠加层。
在发布版本中,iPhone X显示叠加层中的奇怪颜色,但是3D场景没有问题。调试版本会崩溃,并显示错误日志:“-[MTLDebugRenderCommandEncoder validateFramebufferWithRenderPipelineState:]:1196:失败断言`针对颜色附件0,渲染管道的像素格式(MTLPixelFormatRGBA8Unorm_sRGB)与帧缓冲区的像素格式不匹配(MTLPixelFormatBGR10_XR)。'”
我理解的是2D和3D场景的像素格式不同。我不知道如何更改。有什么建议吗?
此错误仅会在iPhone X上显示,而不会在模拟器或任何其他设备上显示(4s、5s、6 Plus、6s、7、iPad Pro 1G)。当我使用OpenGL ES渲染器时,一切正常。当我关闭SCNDisableLinearSpaceRendering时,Metal渲染器也可以正常工作,但是3D颜色渲染当然会有很大不同。
如果您有iPhone X,则可以通过从游戏模板创建新项目并在viewDidLoad()中添加此代码来重现此问题:
let overlaySize = CGSize(width: 100, height: 100)
let overlay = SKScene(size: overlaySize)
let sprite = SKSpriteNode(color: UIColor.blue, size: overlaySize)
overlay.addChild(sprite)
scnView.overlaySKScene = overlay

如果 iPhone 8/8 Plus 也有类似情况,我也非常感兴趣听到。


你看到了 https://dev59.com/OZrga4cB1Zd3GeqPsM2D 吗? - Knight0fDragon
@Knight0fDragon找到了一个解决方法,但您是否意识到任何缺点?https://stackoverflow.com/questions/49246043/ios-drawbacks-of-disabling-metal-api-validation-in-order-to-fix-pipeline-failed - Crashalot
禁用API验证只能帮助您处理崩溃的调试版本。但是颜色偏移仍将发生。据我所知,发布版本无论如何都不会崩溃(当我的应用程序已经上线时,我遇到了这个错误)。 - Dorian Roy
@DorianRoy 在发布时Assert被忽略,因此问题仍然存在,只是错误消失了。 - Knight0fDragon
3个回答

3
一个有效的解决方法是禁用Metal API验证(在“编辑方案”>“选项”中)。
不确定缺点是什么,但至少应用程序不会因此崩溃。

1

1

同时,我看到有人报告了iOS 11中SceneKit的其他问题。所以我认为这是iOS 11中的一个bug。一个月前我提交了一个radar,但这个问题在11.2.5中仍然存在。

我的当前解决方法是使用OpenGL ES渲染器而不是Metal。


不行。一次只能使用一个渲染器。 - Dorian Roy
你可以在SCNView的renderingAPI属性中选择渲染器。 - Dorian Roy
我已经阅读过,如果您不调用presentScene,而是手动将场景变量分配给视图,则可以解决此问题。有人可以验证吗? - Knight0fDragon
@Knight0fDragon,如何在项目级别上解决这个问题?感谢您的快速回复! - Crashalot
因为设置了适合SpriteKit和SceneKit的正确颜色空间。 - Knight0fDragon
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接