2011-12-01 114 views
1

我已經創建了一個只包含三角形頂點的頂點緩衝區對象,用於使用GL_TRIANGLES選項進行繪製。我的VBO沒有顏色信息,因爲我改變每一幀的顏色。如何從頂點緩衝區對象中繪製單個三角形並設置其顏色?

現在我想要在每次迭代設置默認的頂點顏色這樣的後繪製在循環個體三角形:

glColor4f(red, green, blue, 1); 

但我不知道如何執行實際的繪製。

如果我想從VBO中挑選一個或兩個三角形以用特定顏色繪製它們,我必須使用glDrawArrays嗎?或者我必須使用glDrawElements

是否有更有效的方法來設置VBO中每個三角形的顏色然後繪製它?或者在每個幀的循環中調用glColor44glDrawArrays都可以嗎?

回答

3

首先,我寧願建議忽略較高的內存成本,只在VBO內存儲每個頂點的顏色,因此只需爲每個三角形的頂點複製三角形的顏色(不能設置每個三角形顏色)。這最有可能比循環中繪製單個三角形更有效率。請記住,VBOs的優勢不僅在於它們可能的GPU存儲,而且事實上,不需要每個三角形甚至頂點的驅動程序調用。因此,只需將每個三角形的顏色複製到每個頂點的顏色中,然後使用一次調用就可以繪製所有內容(glDrawArraysglDrawElements無論如何都需要複製幾乎每個頂點,這使得索引無用)。

說,你當然可以繪製個別三角形與glDrawArrays,這就是firstcount參數的目的。所以如果你有一個包含3個三角形的9個頂點的VBO,只需撥打

glDrawArrays(GL_TRIANGLES, 3, 3); 

只繪製第二個三角形。那很簡單。同樣,您可以使用countoffset參數glDrawElements來選擇要繪製的索引數組的特定部分。

+0

太棒了!非常感謝!所以基本上,我會繼續創建一個結構數組,其中包含交錯的頂點顏色頂點顏色(...)數據,然後在每個幀中將glMapBufferOES + memcpy顏色添加到GPU中。對於每種顏色,每一幀,在循環中調用memcpy有多痛苦?這是交錯的數據交換嗎?否則,如果不交錯,我可以在每一幀都用一大塊顏色調用memcpy一次。你認爲什麼更好? – openfrog

+0

@openfrog很難回答,因爲交錯可能會更好。但是你說得對,更新一大塊內存,而不是很多散佈的內存也許會更好。在這種情況下,您甚至可以將位置放在一個VBO中,並將顏色放在另一個VBO中,這樣您就可以更新整個顏色的VBO,這對於更新零件而言又具有一些性能優勢(如果正確)。我想,它需要進行測試。 –

+0

使用兩個VBO是有道理的。這是否需要使用索引? – openfrog

相關問題