Since a while I am looking around to find answers to my Issue, but cannot find anything that really helps, or explains what is happening. I also over and over checked everything I found on SO, but couldn't find the answer.
The Issue is happening continuously when displaying Objects in the AR World. iEx I place an object to a Plane on the floor, which is my invisible Shadow Plane. Then it depends all on the viewing angle from the device. To clarify, I added to images, which has just a slightly different viewing angle. Have a look what is happening to the shadows:

I would like to have a good shadow all the time and not such artefacts as you can see.
Note: I already played around using the shadowSampleCount, the Bias, and all the other options, that should help to get a proper, low rendering cost shadow.
Here are is the extract of the relevant code for Lighting and Plane, Material, etc
For the SCNLight:
class func directionalLight() -> SCNLight {
    let light = SCNLight()
    light.type = .directional
    light.castsShadow = true
    light.color = UIColor.white
    light.shadowMode = .deferred
    light.shadowSampleCount = 8
    light.shadowRadius = 1
    // light.automaticallyAdjustsShadowProjection = false
    light.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.75)
    light.categoryBitMask = -1
    return light
}
and how I add it:
func setupLights() {
    lightDirectionNode.light = Lighting.directionalLight()
    // lightDirectionNode.eulerAngles = SCNVector3(-66.degreesToRadians, 0, 0)
    lightDirectionNode.eulerAngles = SCNVector3(0, 90.degreesToRadians, 45.degreesToRadians)
    sceneView.scene.rootNode.addChildNode(lightDirectionNode)
}
For the SCNPlane:
class func shadowPlane() -> SCNNode {
    let objectShape = SCNPlane(width: 200, height: 200)
    objectShape.heightSegmentCount = 2
    objectShape.widthSegmentCount = 2
    objectShape.cornerRadius = 100
    objectShape.cornerSegmentCount = 16
    let objectNode = SCNNode(geometry: objectShape)
    objectNode.geometry?.firstMaterial?.diffuse.contents = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
    objectNode.geometry?.firstMaterial?.colorBufferWriteMask = SCNColorMask(rawValue: 0)
    objectNode.physicsBody = Physics.floorPhysicsBody(shape: objectShape)
    objectNode.name = "floor"
    objectNode.renderingOrder = -10 // renderingOrder // 0
    return objectNode
}
and how I add it:
func setupShadowPlane() {
    let shadowPlane = NodeFactory.shadowPlane()
    // Set the Node's properties
    shadowPlane.position = SCNVector3(x: (focusSquare.lastPosition?.x)!, y: (focusSquare.lastPosition?.y)!, z: (focusSquare.lastPosition?.z)!)
    shadowPlane.eulerAngles = SCNVector3(-90.degreesToRadians, 0.0, 0.0)
    sceneView.scene.rootNode.addChildNode(shadowPlane)
}
What am I doing wrong? Can anyone help?
There are 3 more instance properties to take into consideration:
var shadowRadius: CGFloat { get set }
var shadowCascadeCount: Int { get set }
var shadowCascadeSplittingFactor: CGFloat { get set }
If you don't setup these ones they definitely cause rendering artifacts.
let lightNode = SCNNode()
lightNode.light = SCNLight()
// POSITION OF DIRECTIONAL LIGHT ISN'T IMPORTANT.
// ONLY DIRECTION IS CRUCIAL FOR DIRECTIONAL LIGHTS.
lightNode.rotation = SCNVector4(x: 0, y: 0, z: 0, w: 1)
lightNode.light!.type = .directional
lightNode.light!.castsShadow = true
lightNode.light?.shadowMode = .deferred
/* THREE INSTANCE PROPERTIES TO SETUP */
lightNode.light?.shadowRadius = 3.25
lightNode.light?.shadowCascadeCount = 3
lightNode.light?.shadowCascadeSplittingFactor = 0.09
lightNode.light?.shadowColor = UIColor(white: 0, alpha: 0.75)
scene.rootNode.addChildNode(lightNode)
And one more thing – when
Auto Adjustis off:Light, like a camera, has
nearandfarclipping planes for setup.
lightNode.light?.zNear = 0
lightNode.light?.zFar = 1000000    // Far Clipping Plane is important 

Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With