SceneKit – 来自定向光的阴影取决于相机角度

问题描述 投票:0回答:2

这个问题会让大家百思不得其解:在我的项目中,一艘宇宙飞船正飞过一片风景。它投射了一个使用定向光创建的阴影(正下方),因此它的大小不会随着船的高度而改变。我尝试了很多次以使其完全正确,有时它会起作用,而其他时候则不起作用。我有一个移动的相机,这意味着船的角度会根据它飞行的角度而变化。

现在我发现了为什么阴影并不总是按照预期的方式工作:低于某个视角(越是水平视图),阴影会变得像素化,然后闪烁直到完全消失,当相机是完全水平的。

随着视线越来越向下,船的阴影将越来越清晰,并且在大约 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)

我尝试更改阴影半径、阴影偏差、样本计数、自动阴影投影等。似乎没有什么可以解决问题。有谁知道所有参数都有详尽解释的参考资料吗?

swift scenekit shadow directional-light
2个回答
1
投票

要渲染 SceneKit 的深度图(又名投影)阴影而没有伪影,请使用以下值。

.shadowBias

shadowBias 属性指定应用于阴影贴图的校正以校正粉刺伪影(或所谓的面向光表面的阴影条带伪影)。它乘以特定于实现的值以创建恒定的深度偏移。尝试

increase
decrease
这个值。

.shadowMapSize

阴影贴图越大,阴影越精确,但计算速度越慢。如果设置为 (0, 0),则会自动选择阴影贴图的大小。所以,最好尝试默认值。

.shadowSampleCount

在 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          

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 的环境光(我在后期配置中这样做)

© www.soinside.com 2019 - 2024. All rights reserved.