我在理解如何使用OpenGL處理/渲染多個對象時遇到了一些困難。我環顧四周,在Google和OpenGL紅皮書中找到答案,這本書圍繞着我想弄明白的東西跳舞,但我需要看看我是否有這個想法。OpenGL處理多個對象
我的第一個想法是,我應該分別用X,Y和Z處理帶有平移和旋轉變量的位置數據。存儲在一個靜態VBO一個網格爲類,然後對每個實例我想渲染做for-next循環到
- 負載身份
- 轉換爲特定對象的位置/旋轉
- 使用drawarrays到
- 循環渲染網格在那個位置的下一個對象,並重覆上述的每一個對象
是否處理這樣的轉變對於每幀更新影響設備S ignificantly?
有人提到的另一種方法是將每個頂點的所有位置數據都粘在一個VBO中,然後用一次調用進行渲染。在這種方法中,我假設'創建'一個對象,我需要通過一個函數來處理每個頂點的位置數據,該函數將採用其本地座標(通過靜態數組),並將該特定對象的位置數據添加到頂點,然後將其存儲在VBO中?如果是這樣的話,我如何處理旋轉?
我想到的第三個想法是在對象的每個實例中存儲一個4x4矩陣,以保存翻譯/旋轉信息,然後當我進行渲染時,我只需加載該對象的矩陣,從單個VBO,然後加載下一個對象的矩陣,從同一個VBO中繪製,等等......
最後,我看到一些人建議每個單獨的對象都有一個VBO,併爲每個實例調用drawarray。這種方式對我來說似乎效率很低,並且讓我想知道如果您爲每個網格調用VBO,VBO的意義何在。看起來像直接模式(我明白這是折舊)會更快,只是因爲你沒有創建和綁定每個對象的VBO開銷。
這些處理/渲染多個對象的方法是否有效?如果是這樣,每種方法的優缺點是什麼?
最有意義的方法是每個網格具有一個VBO的方法,然後對每個更新進行轉換,或者每次更新加載每個對象的矩陣並以此方式進行呈現。我對OpenGL和圖形渲染相當陌生,所以我試圖完全理解處理呈現多個對象所需信息的最佳方法。
如果一組對象的位置是靜態的,即不動態改變,然後把所有的人都到一個單一的VBO,具有共同的改造和畫他們全都可以用單個glDrawElements電*爲*比迭代更好的性能通過對象繪製每個對象。但只適用於靜態幾何和位置。 – datenwolf
它絕對是VBO的,而不是VAO的。所以我的問題是:我會以某種方式將每個對象的矩陣存儲到VBO中,然後通過綁定的VAO將它傳遞給着色器? –
如果你正在做實例繪製 - 是的。例如,您可以將模型視圖矩陣作爲實例化屬性(使用'glVertexAttribDivisor')。或者,您可以將矩陣設置爲均勻數組,並使用'gl_InstanceID'爲這個數組索引。至於非實例化繪製,我不知道在着色器中知道使用哪個矩陣的明智方法。 – chill