2012-11-22 51 views
6

我在理解如何使用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和圖形渲染相當陌生,所以我試圖完全理解處理呈現多個對象所需信息的最佳方法。

回答

3
  • 變換到特定對象的位置/旋轉

這只是意味着您加載一個4×4矩陣,以均勻的變量。

是否爲每幀更新處理像這樣的轉換會對性能產生顯着影響?

這個變換將在頂點着色器中執行,通過將上述矩陣和頂點座標相乘,並行處理許多頂點。

有人提到的另一種方法是將每個頂點的所有位置數據都粘在一個VBO中,然後使用一次調用進行渲染。在這種方法中,我 假設到「創造」的對象,我需要通過將利用其本地座標(通過靜態數組)和 特定對象的位置數據添加到一個函數來處理每個頂點的位置數據 頂點,然後將其存儲在VBO中?如果 是這種情況,我將如何處理旋轉?

這似乎不是一個好主意,因爲你必須在每一幀上傳數據(或至少在對象位置/方向變化時)。

第三種方法似乎同爲第一,只有在OGL3 +而言,wheras第一似乎是在OGL 2.x的術語:)

最後,我見過一些人建議有一個VBO爲每個單個對象調用 drawarray。

也許你誤解了,他們的意思是VAO,而不是VBO?使用VAO,您可以上傳頂點屬性(在VBO中),綁定VAO,將每個VBO綁定到相應的屬性位置,並且在開始時只執行一次。在每一幀你根本:

// Bind the VAO 
glBindVertexArray(vao) 

// Draw the object 
glDrawArrays/glDrawArraysInstanced/etc. 

// CLear VAO binding 
glBindVertexArray(0) 

注意,你仍然可以有頂點在同一個VBO許多不同的對象屬性,記得glDrawArrays等都有一個參數,它從哪裏數組中開始繪製確定。

+1

如果一組對象的位置是靜態的,即不動態改變,然後把所有的人都到一個單一的VBO,具有共同的改造和畫他們全都可以用單個glDrawElements電*爲*比迭代更好的性能通過對象繪製每個對象。但只適用於靜態幾何和位置。 – datenwolf

+1

它絕對是VBO的,而不是VAO的。所以我的問題是:我會以某種方式將每個對象的矩陣存儲到VBO中,然後通過綁定的VAO將它傳遞給着色器? –

+1

如果你正在做實例繪製 - 是的。例如,您可以將模型視圖矩陣作爲實例化屬性(使用'glVertexAttribDivisor')。或者,您可以將矩陣設置爲均勻數組,並使用'gl_InstanceID'爲這個數組索引。至於非實例化繪製,我不知道在着色器中知道使用哪個矩陣的明智方法。 – chill