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(在用户设备上运行):
通过将其材质的光照模型从SCNLightingModelPhysicallyBased
为SCNLightingModelBlinn
您可以在iOS 10
上渲染场景,就像在iOS 9
上渲染SCNLightingModelBlinn
。
示例 :如果场景中只有一个3D模型:
for(SCNMaterial * mt in model.geometry.materials) mt.lightingModelName = SCNLightingModelBlinn;
但是,通过这样做,您将无法利用PBR。 如果您想继续使用PBR,那么您可以使用SCNLight
的intensity
和temperature
属性来实现不同的结果。
这是Scene Kit中已确认的错误。 我们在Bug Reporter中提交了一个错误号为28459280的报告。问题是Metal总是在iOS 10 locksAmbientWithDiffuse
设置为true
。
根据Scene Kit工程师之一的说法,解决方法是手动将locksAmbientWithDiffuse
设置为true
用于相关节点(在此示例中为楼层节点),然后在iOS 8/9上调整光照,直到达到所需的外观。
这应该确保iOS 10场景看起来与iOS 8/9场景相同。