现场光源多如何处理?

How to handle many light sources on the scene?

我有一个带有大量光源(大约 350 个)的地图定义。当我尝试创建 THREE.PointLight 对象并将它们添加到场景时,出现以下错误以及低 FPS:

three.js:29438 THREE.WebGLProgram: shader error:  0 gl.VALIDATE_STATUS false gl.getProgramInfoLog Fragment shader active uniforms exceed MAX_FRAGMENT_UNIFORM_VECTORS (1024).

这是什么意思?场景中是否有 THREE.PointLight 个对象的限制?当你有很多光源时,有什么好的做法可以保持高性能吗?

现在唯一想到的就是减少光源的数量,只留下我真正需要的。

此错误意味着您已经超出片段着色器中的最大制服数量。此限制由您的显卡 and/or 驱动程序决定。您可以前往 http://webglreport.com/ 查看。

看起来在您的系统上限制是 1024。Three.js 灯通常使用 6-10 个制服,具体取决于灯的类型和 material。鉴于您使用的是约 350 盏灯,因此您吹得超过了这个限制是有道理的。

一般来说,350 个离散灯很多,可能远远超出您的需要。使用更多的灯也是计算密集型的。典型的 WebGL 场景只有少数几个。您可能需要考虑其他技术来实现您想要的。