同じおよび(マップを持つ)から構築された多数(〜1000)のTHREE.Mesh
オブジェクトがあります。THREE.Geometry
THREE.MeshPhongMaterial
これらのオブジェクトを個別に色付け (色付け) したいと思います。
素朴に、mesh.material.color
プロパティを変更してみましたが、いずれかのオブジェクトでこのプロパティを変更すると、すべてのオブジェクトの色が一度に変更されます。すべてのオブジェクトで共有されるマテリアルは 1 つだけなので、これは理にかなっています。
私の次のアイデアは、THREE.MeshPhongMaterial
オブジェクトごとに個別に作成することでした。THREE.Mesh
そのため、同じ から構築された多数のオブジェクトがありますTHREE.Geometry
が、個別のものがありますTHREE.MeshPhongMaterials
(同じテクスチャを共有しています)。これにより、色を個別に変更できますが、パフォーマンスは低下します。クロム プロファイラは、アプリがテクスチャの切り替えなどの重要な処理にかなりの時間を費やしていることを示しています。
マテリアルの色は、シェーダーで統一されています。したがって、そのユニフォームの更新は非常に迅速に行われるはずです。
質問:メッシュ レベルからマテリアル カラーをオーバーライドする方法はありますか?
もしあれば、すべてのオブジェクトでマテリアルを共有し、色を個別に変更しながら、パフォーマンスを取り戻すことができると思います.
[v49 と v54 でテストしましたが、パフォーマンスと劣化は同じです]
更新:テスト ケースを作成しましたが、これによるパフォーマンスの低下は思ったよりも小さくなっていますが、まだ測定可能です。
以下に 2 つのリンクを示します。
- http://danceliquid.com/docs/threejs/material-test/index.html?many-materials=false
- http://danceliquid.com/docs/threejs/material-test/index.html?many-materials=true
最初のケースでは、2 つのマテリアルしかありません。2 番目のケースでは、各立方体に独自のマテリアルがあります。このマシンで最初のケースのフレームレートを測定すると 53 fps で、2 番目のケースのフレームレートは 46 fps です。これは約 15% の低下です。
どちらの場合も、すべての立方体のマテリアルの色がフレームごとに変更されます。多くのマテリアルがある場合、実際には各立方体が独自の色になっていることがわかります。マテリアルが 2 つしかない場合は、(予想どおり) すべてが同じ色になっていることがわかります。