这个问题会让大家百思不得其解:在我的项目中,一艘宇宙飞船正飞过一片风景。它投射了一个使用定向光创建的阴影(正下方),因此它的大小不会随着船的高度而改变。我尝试了很多次以使其完全正确,有时它会起作用,而其他时候则不起作用。我有一个移动的相机,这意味着船的角度会根据它飞行的角度而变化。
现在我发现了为什么阴影并不总是按照预期的方式工作:低于某个视角(越是水平视图),阴影会变得像素化,然后闪烁直到完全消失,当相机是完全水平的。
随着视线越来越向下,船的阴影将越来越清晰,并且在大约 10 米以上。 30°刚刚好。
我已经检查过 Stack Overflow,但似乎改变角度的相机很不寻常。我想玩家节点上方的固定摄像头更常见。
有人知道这种行为吗?这是我的代码。
self.dirLightNode = SCNNode()
self.dirLightNode.light = SCNLight()
self.dirLightNode.position = SCNVector3(x: -0 * dividerx,
y: 20 * dividery,
z: -00)
self.dirLightNode.light?.type = .directional
self.dirLightNode.light!.color = UIColor.black
self.dirLightNode.light?.castsShadow = true
self.dirLightNode.light?.shadowMode = .deferred
self.dirLightNode.light?.categoryBitMask = 1
self.dirLightNode.light?.shadowColor = UIColor.black.withAlphaComponent(0.8)
self.dirLightNode.rotation = SCNVector4Make(1,0,0, 1.5 * Float.pi)
self.dirLightNode.light?.orthographicScale = 10
self.dirLightNode.light?.shadowRadius = 10
self.dirLightNode.light?.shadowBias = 1
self.dirLightNode.light?.zFar = 100
self.dirLightNode.light?.zNear = 0
self.dirLightNode.light?.maximumShadowDistance = 10000
self.dirLightNode.light?.shadowSampleCount = 1
self.dirLightNode.light?.shadowMapSize = CGSize(width: 4096, height: 4096)
我尝试更改阴影半径、阴影偏差、样本计数、自动阴影投影等。似乎没有什么可以解决问题。有谁知道所有参数都有详尽解释的参考资料吗?
要渲染 SceneKit 的深度图(又名投影)阴影而没有伪影,请使用以下值。
shadowBias 属性指定应用于阴影贴图的校正以校正粉刺伪影(或所谓的面向光表面的阴影条带伪影)。它乘以特定于实现的值以创建恒定的深度偏移。尝试
increase
或decrease
这个值。
阴影贴图越大,阴影越精确,但计算速度越慢。如果设置为 (0, 0),则会自动选择阴影贴图的大小。所以,最好尝试默认值。
在 iOS 10.0 及更高版本或 macOS 10.12 及更高版本上,当
shadowSampleCount
设置为 0 时,将根据平台选择默认样本计数。
self.dirLightNode.light?.shadowMapSize = CGSizeZero // default
self.dirLightNode.light?.shadowRadius = 3.0 // default
self.dirLightNode.light?.shadowBias = 0.1
self.dirLightNode.light?.shadowSampleCount = 0
好吧,很难说,你的项目有什么问题。这是我的配置,我如何设置灯光(在本例中为定向灯)。试试看,如果它对您有任何帮助,请告诉我。
static func getSceneLight() -> SCNLight {
let light = SCNLight()
// Light Config
light.type = .directional
light.color = UIColor.white
light.shadowMode = .forward
light.castsShadow = true
light.categoryBitMask = -1 // Shine on Everything
light.shadowCascadeCount = 4 // Important for good Shadows
light.automaticallyAdjustsShadowProjection = true // NEW, good for sharp shadows
print("Scene Light requested.")
// Not Configured
// light.shadowCascadeSplittingFactor = 0.1 // DO NOT SET!!!
// light.shadowRadius = 2.0 // 3.25 // suggestion by StackOverflow
// light.shadowCascadeCount = 3 // suggestion by StackOverflow
// light.shadowCascadeSplittingFactor = 0.09 // suggestion by StackOverflow
// light.shadowBias = 2.0 // 0.1 // (in testing)
// light.parallaxCorrectionEnabled = true // what is this
// light.shadowSampleCount = 1.0 // DO NOT SET!!!
// light.zNear = 0.1
// light.zFar = 1000000.0
// light.orthographicScale = 1.0
return light
}
可以看到,有很多选项没有配置。我没有运气使用它们。我希望,我能帮助你。
PS:通常我使用 1000.0 的强度值,并添加具有相同颜色和强度 250.0 的环境光(我在后期配置中这样做)