SceneKit:如何在iOS 10上重现iOS 9灯光色彩效果(单向,一个环境)而不禁用PBR?

正如 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。

我们的应用程序可让用户自定义定向灯的颜色。 目标是在利用PBR的同时从iOS 10场景中的iOS 9场景重现相同的定制照明。

1)我们如何确保iOS 10场景与iOS 8/9场景完全相同?

2)如何在受益于PBR的同时实现#1?

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

在此处输入图像描述

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

在此处输入图像描述

通过将其材质的光照模型从SCNLightingModelPhysicallyBasedSCNLightingModelBlinn您可以在iOS 10上渲染场景,就像在iOS 9上渲染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场景相同。