我正在使用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限制?如果没有,是否有人知道可能导致问题的原因?
答案 0 :(得分:1)
在前向渲染中,OpenGL ES(和WebGL)对同时开启的灯光数量有限制。这些限制通常是8,所以我很惊讶你得到了37。事情随着延迟渲染而变化,你可以拥有尽可能多的灯光。因此,不要使用WebGLRenderer
而是使用WebGLDeferredRenderer.