SceneKit:如何在不禁用 PBR 的情况下在 iOS 10 上重现 iOS 9 照明颜色效果(一个方向,一个环境)?

SceneKit: how to reproduce iOS 9 lighting color effect (one directional, one ambient) on iOS 10 without disabling PBR?

As this thread 在 Apple 论坛上提到,iOS 10 上的灯现在变弱并改变了场景的外观。

线程建议将 SCNDisableLinearSpaceRendering 设置为 YES,但这没有用。换句话说,使用 SCNDisableLinearSpaceRendering 不会使您的场景在 iOS 10 和 iOS 9 上看起来一样——至少在我们的测试中不会。

我们也尝试过:

floorNode.geometry?.firstMaterial?.lightingModel = SCNMaterial.LightingModel.blinn

下面的截图显示了同一场景之间的区别。注意地板是如何从绿色变成黄色的,即使照明是一样的。

场景包含一盏平行光和一盏环境光。

场景再现文件:https://www.dropbox.com/sh/cg5f7hyf1oonxfu/AAAJef7LhpSxuJyUSjqfGbmca?dl=0.

即使它确实有效,将 SCNDisableLinearSpaceRendering 设置为 YES 似乎也会禁用 PBR。

我们的应用程序允许用户自定义方向灯的颜色。目标是在 iOS 10 场景中重现来自 iOS 9 场景的相同自定义光照,同时利用 PBR。

1) 我们如何确保 iOS 10 个场景与 iOS 8/9 个场景看起来相同?

2) 如何在受益于 PBR 的同时取得第一名?

iOS 8/9(在模拟器上运行):

iOS 10(运行 在用户设备上):

您可以像在 iOS 9 上渲染场景一样在 iOS 10 上渲染场景,方法是将其材质的光照模型从 SCNLightingModelPhysicallyBased 更改为 SCNLightingModelBlinn

示例:如果场景中只有一个 3D 模型:

for(SCNMaterial * mt in model.geometry.materials)
    mt.lightingModelName = SCNLightingModelBlinn;

但是,这样做您将无法利用 PBR。如果您想继续使用 PBR,那么您可以使用 SCNLightintensitytemperature 属性来获得不同的结果。

这是 Scene Kit 中已确认的错误。我们在 Bug Reporter 中提交了一份报告,错误号为 28459280。问题是 Metal 总是在 iOS 10 上将 locksAmbientWithDiffuse 设置为 true

根据一位 Scene Kit 工程师的说法,解决方法是手动将相关节点(在本例中为地板节点)的 locksAmbientWithDiffuse 设置为 true,然后调整光照iOS 8/9 直到达到所需的外观。

这应该确保 iOS 10 个场景与 iOS 8/9 个场景看起来相同。