正如您所希望注意的那樣,您必須在處理頂點數組對象時啓用glEnableVertexAttribArray
屬性數組。儘管您可以爲每個屬性綁定不同的緩衝區,但您無法綁定「每次繪製調用」或類似的不同屬性。這意味着VAO指向的所有內容都必須存儲相同的屬性。當然,您可以忽略VAO提供的某些屬性,但這可能會導致效率低下,並且這可能不是一個好的做法。
這也意味着,每個具有相同VAO綁定的繪製調用使用相同的屬性。我認爲這是確定你是否需要一個新的VAO的最好方法,首先確定你是否需要一組不同的屬性。然後,您可以通過指向索引緩衝區內某個其他位置的一組索引來輕鬆確定要繪製的對象的哪一部分。在一個更加面向對象的場景(比如一個遊戲中,你有不同的網格),最實際的方法是簡單地爲每個網格創建一個或多個VAO。這使您可以爲每個網格具有不同類型的緩衝區(靜態,動態或流)。你甚至可以有幾個大緩衝區(每個緩衝區或類似的1到8 MB),並有多個使用相同緩衝區的VAO。我經常這樣做,以避免頻繁的內存分配。
我只給你們兩個選擇:
- 新VAO對場景中的每一個新的屬性集
- 新VAO爲每個不同的對象的
這取決於類型你有最方便的場景,但在大多數情況下,你可能不會發現性能上的巨大差異。當然有些情況下你的表現會稍微好一點,但你應該自己弄清楚。
考慮到你的問題,我可以看到兩個選項。你沒有說你是否要經常更新頂點。如果您經常更改圖形並更新頂點,我會給這些軸設置自己的VAO,因爲它們永遠都不會改變,因此,他們可以使用靜態緩衝區,而圖形本身可以使用動態緩衝區或流緩衝區。但是如果座標軸是整個圖形的一部分,這意味着圖形本身不會經常更新,爲方便起見,您可以將它們全部放在一個單獨的VAO中。
記住這些只是建議,你應該選擇什麼最適合你的框架和/或有最好的表現或簡單哪一個是最方便的。
希望這有所幫助。