为什么我的阴影在SceneKit中被像素化/断断续续?

时间:2018-12-29 00:54:14

标签: swift scenekit

我无法在SceneKit中获得平滑的阴影。在下面,您将找到将两盏灯都添加到我的场景以及一张图片中的代码。我圈出了像素化的区域。

SceneKit提供的基本几何图形都没有正确着色。

有人知道我该如何解决吗?

谢谢!

        let directionalLight = SCNNode()
        directionalLight.light = SCNLight()
        directionalLight.light?.type = .directional
        directionalLight.light?.castsShadow = true
        directionalLight.eulerAngles = SCNVector3(0, -toRadians(angle: 45), -toRadians(angle: 60))
        self.scene.rootNode.addChildNode(directionalLight)
        let ambientLight = SCNNode()
        ambientLight.light = SCNLight()
        ambientLight.light?.type = .ambient
        ambientLight.light?.color = UIColor.darkGray
        ambientLight.light?.intensity = 5000
        self.scene.rootNode.addChildNode(ambientLight)

See Picture

1 个答案:

答案 0 :(得分:5)

SceneKit使用一种称为“阴影映射”的技术来渲染阴影。这些效果是这项技术的正常现象,但在您的情况下有些极端。

如果您想了解更多有关阴影贴图的信息,以及如何获得最佳效果的信息,那么值得Google查询

在您的情况下,我认为首先要看的是您的directionalLight节点的position和它的SCNLight的{​​{3}}。

为什么定向灯的位置? SceneKit将从灯光角度渲染场景的仅深度图像,然后使用该图像来计算最终渲染中的像素是否处于阴影中。如果光线位置距离您的场景较远,则场景将仅占shadow map的一小部分。

确保场景在shadow map上有很多可用像素的另一种方法是通过简单地使用shadowMapSize属性增加阴影贴图的大小。这样会增加渲染时间和GPU内存使用量,因此请尝试在此处找到“最佳点”。