5

タイトルが示すように、特定のShaderMaterialをメッシュごとに再利用したいのですが、メッシュごとにユニフォームのセットが異なります(実際、一部のユニフォームはメッシュ間で異なる場合がありますが、必ずしもすべてではありません):可能ですか?

この状況でメッシュごとに完全なシェーダーマテリアルを作成する必要があるのはリソースの無駄のようです。単一の頂点/フラグメントシェーダープログラムを使用し、メッシュに応じて値が変化するさまざまなユニフォームを使用して構成するというアイデアです。 。メッシュごとに新しいShaderMaterialを作成すると、多くの重複が発生します(頂点+フラグメントプログラム+ Material / ShaderMaterialクラスの他のすべてのデータメンバー)。

エンジンがメッシュを描画する前にコールバックを呼び出すことができれば、ユニフォームを変更して、やりたいことを達成できます。もう1つの可能性は、共有ShaderMaterialへのポインターとメッシュの特定のユニフォームのみを保持する「LiteShaderMaterial」を持つことです。

私の質問はこれに関連していることに注意してください。同じジオメトリとマテリアルを持つ多くのメッシュですが、色を変更できますか?しかし、私は主にリソースの浪費を懸念しているので、それでも違います-パフォーマンスに関しては、エンジンはすべてに注意するのに十分スマートでなければならないので、複数のShaderMaterialを使用するか単一のShaderMaterialを使用するかで大きな違いはないと思います資料には同じプログラムがあり、gfxカードに再送信しないでください。

ありがとう

4

2 に答える 2

8

のクローンを作成するShaderMaterial場合、属性と頂点/フラグメントプログラムは参照によってコピーされます。ユニフォームだけが値によってコピーされます。これはあなたが望むものです。

これは効率的に機能するはずです。

ShaderMaterialを作成し、を使用ShaderMaterial.clone()してメッシュごとにクローンを作成することで、それを自分で証明できます。次に、各材料に一意の均一な値を割り当てます。

コンソールに「render.info」と入力します。1つのプログラムが表示されます。

three.js r.64

于 2013-03-24T16:23:59.227 に答える
1

ShaderMaterialを使用するかどうかに関係なく、同じパラメータを使用して複数のインスタンスを安全に作成できますclone。Three.jsは、material.needsUpdate最初trueは各インスタンスに対して行われた結果として、いくつかの追加のチェックを実行しますが、その後、すべてのインスタンスに対して同じプログラムを再利用できるようになります。

新しいリリースでは、別のオプションは単一のを使用することですが、オブジェクトの関数ShaderMaterialのユニフォームに変更を追加します。onBeforeRenderこれにより、レンダラーでの不要な呼び出しが回避さinitMaterialれますが、これによって全体的なソリューションが高速になるかどうかをテストする必要があります。レンダリングの前に変更されているものをプッシュしすぎると、危険な解決策になる可能性があります。最悪の場合、レンダリング中に単一のマテリアルを複数回再コンパイルする必要が生じる可能性があります。さらなるヒントについては、このガイドをお勧めします。

于 2019-07-29T00:46:55.270 に答える