正如標題所說,我想重複使用給定的ShaderMaterial用於不同的網格,但爲每個網格使用不同的制服集合(實際上,某些制服可能會在網格之間變化,但不一定全部):是否有可能?Three.js,在網格之間共享ShaderMaterial,但使用不同的統一集合
在這種情況下,我認爲必須爲每個網格物體創建一個完整的ShaderMaterial,這個想法似乎是浪費資源,這個想法是要有一個頂點/片段着色器程序,但要通過不同的制服來配置它,取決於網格。如果我爲每個網格物體創建一個新的ShaderMaterial,我將最終產生大量重複(頂點+碎片程序+ Material/ShaderMaterial類的所有其他數據成員)。
如果引擎在繪製網格之前能夠調用回調,我可以更改制服並實現我想要做的事情。另一種可能性是有一個「LiteShaderMaterial」,它將持有一個指向共享ShaderMaterial +的指針,只有我的網格的特定製服。
請注意,我的問題與這一個Many meshes with the same geometry and material, can I change their colors?有關,但仍然不同,因爲我最關心的是資源浪費 - 性能方面我不認爲在使用多個ShaderMaterial或一個因爲引擎應該足夠聰明,以便注意所有材料具有相同的程序,並且不會將它們重新發送到gfx卡。
由於
謝謝您的回答,但正如我上面說的,我真的不通過性能,但受資源,而不是關注:對於例如,頂點/片斷程序將在每個被複製材質以及ShaderMaterial/Material的所有其他數據成員。今天我們所擁有的所有內存可能不是一個大問題,但是由於當我有一個(或者只有幾個不同的)頂點/片段着色器時,我有成千上萬個網格對我來說感覺不對勁,所以不得不創建數以千計的ShaderMaterial。我需要的只是改變這些程序的輸入。 – Popov 2013-03-24 18:45:15
不正確。克隆時,通過引用複製頂點/片段程序和屬性。只有制服被價值複製,這就是你想要的。 – WestLangley 2013-03-24 19:02:46
頂點和片段着色器變量是ShaderMaterial類中的字符串,因此在克隆材質時,每次都會複製整個程序。另外,當我創建一個新材質時,我得到的所有其他數據成員都使用與我最初着色器相同的值進行復制,因爲這些值不會更改(並且大多數成員不會用於所有)。我想我需要我上面所描述的,一個lite ShaderMaterial,我將爲每個網格實例化,並且只保存統一數組+對「主」着色器的引用。 – Popov 2013-03-24 19:31:59