21

同じおよび(マップを持つ)から構築された多数(〜1000)のTHREE.Meshオブジェクトがあります。THREE.GeometryTHREE.MeshPhongMaterial

これらのオブジェクトを個別に色付け (色付け) したいと思います。

素朴に、mesh.material.colorプロパティを変更してみましたが、いずれかのオブジェクトでこのプロパティを変更すると、すべてのオブジェクトの色が一度に変更されます。すべてのオブジェクトで共有されるマテリアルは 1 つだけなので、これは理にかなっています。

私の次のアイデアは、THREE.MeshPhongMaterialオブジェクトごとに個別に作成することでした。THREE.Meshそのため、同じ から構築された多数のオブジェクトがありますTHREE.Geometryが、個別のものがありますTHREE.MeshPhongMaterials(同じテクスチャを共有しています)。これにより、色を個別に変更できますが、パフォーマンスは低下します。クロム プロファイラは、アプリがテクスチャの切り替えなどの重要な処理にかなりの時間を費やしていることを示しています。

マテリアルの色は、シェーダーで統一されています。したがって、そのユニフォームの更新は非常に迅速に行われるはずです。

質問:メッシュ レベルからマテリアル カラーをオーバーライドする方法はありますか?

もしあれば、すべてのオブジェクトでマテリアルを共有し、色を個別に変更しながら、パフォーマンスを取り戻すことができると思います.

[v49 と v54 でテストしましたが、パフォーマンスと劣化は同じです]

更新:テスト ケースを作成しましたが、これによるパフォーマンスの低下は思ったよりも小さくなっていますが、まだ測定可能です。

以下に 2 つのリンクを示します。

最初のケースでは、2 つのマテリアルしかありません。2 番目のケースでは、各立方体に独自のマテリアルがあります。このマシンで最初のケースのフレームレートを測定すると 53 fps で、2 番目のケースのフレームレートは 46 fps です。これは約 15% の低下です。

どちらの場合も、すべての立方体のマテリアルの色がフレームごとに変更されます。多くのマテリアルがある場合、実際には各立方体が独自の色になっていることがわかります。マテリアルが 2 つしかない場合は、(予想どおり) すべてが同じ色になっていることがわかります。

4

2 に答える 2

7

はい。オブジェクトごとに、 を使用してマテリアルのクローンを作成し、 とmaterial.clone()を変更しemissivecolor、オブジェクトのマテリアルをこのクローンに設定します。シェーダーとアトリビュートは参照によってコピーされるため、毎回マテリアル全体を複製する必要はありません。実際、値によってコピーされるのはユニフォーム ( や など) だけemissiveですcolor。したがって、個々のオブジェクトごとにこれらを変更できます。

個人的には、元の素材をオブジェクトの別のカスタム プロパティに保存して、後で簡単に元に戻せるようにしています。あなたのニーズが何であるかによって異なります。

于 2014-04-14T11:22:32.040 に答える
0

独自のシェーダーを作成している場合uniformは、一般的な色合い (頂点固有ではない) に変数を使用し、それをシェーダーに渡して全体的な色を考慮することができます。 vec4f_tおよびvec4f()C 部分では標準ではありませんが、コードにはおそらく既に同等のものがあります。

子:

vec4f_t hue = vec4f(....);  // fill in as desired
// load the shader so that GLuint shader_id is available.
// "hue" is a uniform var in the vertexshader
GLUint hue_id = glGetUniformLocation(shader_id, "hue"); 
// later, before rendering the object:
glUniform4fv(hue_id, 1, &hue);

頂点シェーダー:

uniform vec4 hue;  // add this and use it in the texture's color computation
于 2013-08-04T06:20:16.680 に答える