1

ブレンダーからエクスポートした単純な屋内シナリオがあります。天井に 3 つの球体がある部屋があり、その中にそれぞれの光源があります。ライトはそれぞれ単独ではうまく機能しますが、すべてをシーンに挿入すると、そのうちの 1 つだけが機能します。2 つで動作することもありますが、3 つで動作することはありません。ライトのコードは次のとおりです。

luz_sala1 = new THREE.PointLight(0xFFFFFF,0.5, 50.0);
luz_sala1.position = new THREE.Vector3(16.14323,2.52331,13.93375);
scene.add(luz_sala1);

luz_sala2 = new THREE.PointLight(0xFFFFFF, 0.5, 50.0);
luz_sala2.position = new THREE.Vector3(27.70114,2.52331,-6.20571);
scene.add(luz_sala2);

luz_sala3 = new THREE.PointLight(0xFFFFFF, 0.5, 50.0);
luz_sala3.position = new THREE.Vector3(21.50580,3.10719,-27.82775);
scene.add(luz_sala3);

距離を 0 に設定するとうまくいきますが、これらのライトが存在する領域のみに影響を与える必要があります。 THREE.Spotlight(0xFFFFFF,0.5,50.0,Math.PI, 0) でも試しましたが、同じ結果です。なんとなく距離が同じだと打ち消し合っているように見えませんか?

助けてください、これは非常に紛らわしいです。

編集: また、部屋の別のセクションにいくつかのスポットライト モデル (約 4 つある) がありますが、これらの 4 つのスポットライトをシーンに追加すると、シェーダー コンパイル エラーが発生します。問題を検索した後、レンダラーで maxLights プロパティを設定する必要があることがわかりました。10 に設定しましたが、まだ問題が発生します。シーンに 4 つを超えるライトを配置することはできません。他にできることはありますか?

編集2:ここにいくつかの画像があります。参考までに、テレビに近い方が「luz_sala1」、真ん中が「luz_sala2」、遠い方が「luz_sala3」です。

これは上記のコード (3 つのライトすべて) を使用したものですが、強度は 0.8 です。 http://www.mediafire.com/view/?s85qr4rplhort29

これは 2 と 3 をオンにしたものです ("scene.add(luz_sala1);" にコメント): http://www.mediafire.com/view/?83qbbua9f8ee3b4

ご覧のとおり、2 つのポイント ライトはうまく連携しますが、3 つあると最初のライトに「足し合わせる」ように見えますか?

4

1 に答える 1

0

maxLightプロパティが効果を発揮しないのは、ハードウェア、ドライバー、またはANGLE(WebGLをDirect3Dに変換するライブラリ)がシェーダーで十分に変化するベクトルをサポートしていないことが原因である可能性があります。各ライトには、他のものも必要です。これは、一般的な問題の背景にもある可能性があります。

より多くのライトを使用するには、次の3つのオプションがあります。

  1. ブラウザでANGLEよりもネイティブOpenGLを優先させる場合に役立つかどうか試してください(手順についてはgoogle)。ただし、最新のOpenGLドライバがインストールされていることを確認してください。
  2. 遅延レンダラーを実装します。これは現在、デスクトップの世界では非常に一般的ですが、フレームバッファの制限により、WebGLで良好なパフォーマンスで実装することは不可能ではないにしても注意が必要です。
  3. 一部のライトのみを使用し、残りを無効にするライトマネージャーを実装します。最も簡単ですが、完璧な方法とはほど遠いのは、カメラに最も近いライトを選択することです。

また、現在、SpotLightは一方向に影を落とす単なるPointLightであることに言及する価値があります。

于 2012-09-14T09:28:19.633 に答える