这个问题会让大家困惑:在我的项目中,一艘宇宙飞船正飞过一片风景。它投射出一个阴影(正下方),这是通过使用定向光创建的,所以它的大小不会随着船的高度而改变。我试了很多次,试图完全正确,有时它能工作,有时它不能。我有一个移动的相机,这意味着船的Angular 会根据它飞行的Angular 而变化。
现在我发现了为什么影子并不总是以它应该的方式工作:低于某个视角(水平视角越多),阴影将变得像素化,然后 Flink ,直到相机完全水平时阴影完全消失。
随着视野越来越向下,船的阴影将变得越来越清晰,在大约30°的上方,它刚刚好。
我已经在Stack Overflow中检查过了,但是看起来一个可变Angular 的摄像头是相当不寻常的。我猜一个固定在玩家节点上方的摄像头更常见。
有人知道这个行为吗?这是我的代码。
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)
我试着改变了shadowradius,shadowBias,samplecount,automaticshadowprojection,等等。似乎没有什么能解决这个问题。有人知道一个参考资料,在那里所有的参数都被解释得很透彻吗?
2条答案
按热度按时间holgip5t1#
若要渲染SceneKit的“深度贴图”(也称为投影)阴影而不出现瑕疵,请使用以下值。
.shadowBias
shadowBias***属性指定要应用于阴影贴图的校正,以校正***痤疮伪影(或面向光线的表面上所谓的阴影条带伪影)。将其乘以特定于实现的值以创建恒定的深度偏移。尝试
increase
或decrease
此值。.shadowMapSize
阴影贴图越大,阴影就越精确,但计算速度越慢。如果设置为(0,0),阴影贴图的大小将自动选择。因此,最好尝试默认值。
.shadowSampleCount
在iOS 10.0及更高版本或macOS 10.12及更高版本上,当
shadowSampleCount
设置为0时,将根据平台选择默认样本计数。wbgh16ku2#
好吧,很难说,你的项目有什么问题。这是我的配置,我如何设置灯光(在这种情况下是定向灯)。给予看,让我知道,如果它以任何方式帮助你。
正如你所看到的,有许多选项未配置。我没有运气使用它们。我希望,我可以帮助你。
PS:通常我使用1000.0的强度值,并添加相同颜色和强度为250.0的环境光(我在后期配置中这样做)