向场景添加超过37个聚光灯时会出现Three.js错误

时间:2013-05-31 02:01:48

标签: javascript three.js

我正在使用Three.js r58(使用WebGLRenderer)创建一个系统,该系统显示建筑物的3D模型,其中包含灯光的实际位置和昏暗水平。

数据库中的每个灯光都由一个CubeGeometry对象(物理灯光)和一个SpotLight(以显示灯光输出的外观)表示,如下所示:

// 'this' is an existing custom object as populated from the database - all code there is fine
var geometry = new THREE.CubeGeometry(4.8, 0.6, 1.36);
var material = new THREE.MeshBasicMaterial({color:0x444444, vertexColors:THREE.FaceColors});

this.objectMesh = new THREE.Mesh(geometry, material);
this.objectMesh.position.set(0, 20, 0);

scene.add(this.objectMesh);

this.lightEmitter = new THREE.SpotLight(0xffffff, 0, 22, true);
this.lightEmitter.position.set(this.objectMesh.position.x, this.objectMesh.position.y - (this.objectMesh.geometry.height / 10), this.objectMesh.position.z);
this.lightEmitter.rotation.set(this.objectMesh.rotation.x, this.objectMesh.rotation.y, this.objectMesh.rotation.z)
this.lightEmitter.target.position.set(this.objectMesh.position.x, 0, this.objectMesh.position.z);
this.lightEmitter.angle = 0.9;
scene.add(this.lightEmitter);

现在,一切都在场景中最多可以处理37个灯光,但是当我添加灯号38时,我收到以下错误:Could not initialise shader VALIDATE_STATUS: false, gl error [1285]

在带有GeForce GTX 650的Windows 7 PC上的Firefox和Chrome以及Ubuntu笔记本电脑上的Firefox中都可以看到此错误(不确定显卡但可以查看是否需要)。在Android Nexus 7上的Chrome浏览器中,我收到了一个额外错误:(0) : error C6007: Constant register limit exceeded; more than 256 constant registers needed to compiled program 50 lines, 1 errors - 不确定这是否相关。

如果我从场景中移除建筑模型并在平面上加载,我还得到:ERROR: too many uniforms有38个灯,37个灯正常工作。我也尝试过防止灯光和物体投射和接收阴影,但它没有帮助。

我是否通过在场景中渲染如此多的灯来达到硬件和/或OpenGL和/或WebGL限制?如果没有,是否有人知道可能导致问题的原因?

1 个答案:

答案 0 :(得分:1)

在前向渲染中,OpenGL ES(和WebGL)对同时开启的灯光数量有限制。这些限制通常是8,所以我很惊讶你得到了37。事情随着延迟渲染而变化,你可以拥有尽可能多的灯光。因此,不要使用WebGLRenderer而是使用WebGLDeferredRenderer.