In order to let all shadows be rendered, I set shadow.camera.top
/ bottom
/ left
/ right
to the directional light (casting shadow), but it causes shadow acne.
I try to use shadow.bias
but still not right. What causes shadow acne and how to fix it?
Here is my code.
light = new THREE.DirectionalLight( 0xffffff );
light.position.set( 38, 82, 1 );
light.castShadow = true;
// light.shadow.bias = -0.001;
light.shadow.mapSize.width = 2048;
light.shadow.mapSize.height = 2048;
light.shadow.camera.near = 0.1; // same as the camera
light.shadow.camera.far = 1000; // same as the camera
light.shadow.camera.top = 120;
light.shadow.camera.bottom = -120;
light.shadow.camera.left = 120;
light.shadow.camera.right = -120;
scene.add( light );
Thanks!!
Setting shadow.bias
to - 0.0005
seems to remove the shadow artifacts. However, the quality of the shadows are still not good since the edges of the shadows look very blocky.
Consider setting the property renderer.shadowMap.type
to THREE.PCFSoftShadowMap
which will noticeable improve the shadow quality. It might also be a good idea to reduce the size of the shadow camera's frustum and only cast shadow in a certain "focus" area. Another option is to bake a high quality lighting into a light map and then apply it to the lightMap
property of the city's material. You can also just increase the resolution of the shadow map to 4096 x 4096
but this will have a performance impact, especially on mobile devices.