Three.js - render.shadowmap.enabled = true减少pointLight达到的最大距离

时间:2018-04-18 14:26:30

标签: three.js

我正在使用three.js在太阳系模拟器上工作,我想实现阴影来模拟阻挡阳光到达其行星的卫星,反之亦然。我已经做了很多关于如何正确实现阴影的搜索,最终我让日食工作了。这是我在光源上用来投射阴影的代码:

sunlight = new THREE.PointLight( 0xFDB813, 2, 0, 2); 
sunlight.position.copy(sun.position);       
sunlight.castShadow = true;
sunlight.shadow.mapSize.set(2048, 2048);

但是,当我将此行添加到我的代码中时:

   renderer.shadowMap.enabled = true

我的聚光灯达到的最大距离减小,不再到达更远的行星。我尝试使用光源的参数,但没有任何变化。我的代码出了什么问题?为什么renderer.shadowMap会降低光源的最大范围?

这是我简化项目的链接

https://jsfiddle.net/hr8yd348/35/

如果代码令人困惑,我道歉,我将我的项目减少到只有两个行星,一个有月球,一个没有月球,远离太阳。似乎破坏我的光源的代码在光源处是第134行。如果你注释掉那条线,那么当光线能够再次到达时,该物体将是可见的。

PS。中心地球按钮将使相机聚焦在月球上的行星上,而中心火星按钮将使相机聚焦在远处的行星上

另外,更改shadow.mapSize.set的值似乎会影响阴影的平滑度。有人可以解释一下吗?谢谢!

2 个答案:

答案 0 :(得分:0)

点光源的阴影将使用基本上是相机来渲染阴影贴图。您可以尝试将阴影摄像机的远侧平面延伸出来,看看是否有帮助。

设置阴影贴图大小越大,它就越平滑,因为它本质上是一个纹理。阴影纹理的分辨率越高,阴影采样就越平滑。

答案 1 :(得分:0)

这就像我可以通过一些摆弄来获得它一样好...... 我禁用了动画以便能够迭代... 我将shadowmap大小调整为4096平方英尺。我切换到PCFSoftShadowmap,模糊半径为1.75 ..

sunlight.shadow.mapSize.set(4096,4096);
sunlight.shadow.radius = 1.75;

主要的问题是,点光阴影贴图本身就是低光照,远离光源,因为它是一个立方体阴影贴图,所以地图在6个面之间平铺。

如果你想要超级清脆的阴影,你可能不得不使用始终瞄准月球的聚光灯来伪造它,或者做一些自定义着色器......

这是小提琴:我制作了中心地球按钮,切换暂停模式.. https://jsfiddle.net/8egcc8eb/