2

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 個のライトで正常に動作します。また、ライトとオブジェクトが影を落としたり受け取ったりしないようにしようとしましたが、役に立ちませんでした。

シーン内に非常に多くのライトをレンダリングすることで、ハードウェアや OpenGL や WebGL の制限に達していませんか? そうでない場合、問題の原因を誰かが知っていますか?

4

1 に答える 1

1

フォワード レンダリングでは、OpenGL ES (および WebGL) には、同時にオンになるライトの数に制限があります。これらの制限は通常 8 であるため、最大 37 になったことに驚きました。必要な数のライトを使用できるディファード レンダリングでは状況が変わります。したがって、を使用する代わりにWebGLRendererWebGLDeferredRenderer.

于 2013-05-31T06:35:54.937 に答える