2011-08-17 101 views
2

我正在使用VBO創建一個應用程序來渲染一些具有困難顏色結構的對象。我注意到,VBO定義元素的顏色等於元素緩衝區中的最後一個頂點索引。例如,當我使用點陣列這樣如何將元素映射到OpenGL VBO中的顏色?

double pointBuf[]={ -0.1d, 0.1d, 0, 
          0.1d, 0.1d, 0, 
          0.1d, -0.1d, 0}; 

顏色陣列:

double colorBuf[] = { 0d, 1d, 0d, 
          0d, 1d, 0d, 
          1d, 0d, 0d}; 

和元件陣列:

int elementBuf[] = {0, 1, 2}; 

來繪製三角形時,將紅色(作爲elementBuf中的最後一個元素是2,在colorBuf中它與紅色匹配)。

事實上,它可能會導致額外的內存使用情況,以正確繪製所有內容。

是否有任何其他可能的方式來鏈接顏色與元素?

+0

你真的需要雙色類型的顏色嗎?如果內存不足,則使用GL_UNSIGNED_BYTE作爲顏色緩衝區,所以R,G,B,A總共需要4個字節,而不是24個字節,因爲您的實現會執行此操作(如果我正確理解了您的代碼)。你也不需要雙打你的頂點位置。除了顏色以外,只需使用浮標。 – Rookie

+0

這只是一個例子,我並不需要雙倍的顏色,我知道。 但是因爲我在很小的區域內運行着大量的頂點,所以我需要這樣的精度,所以我必須使用頂點的雙精度。 無論如何謝謝 – user898722

+0

user898722:我編輯了你的問題,使其更容易理解。請檢查我沒有因此引入一些錯誤。 (隨意恢復我的編輯。) –

回答

2

你需要明白的一件事是,頂點不只是它的位置。頂點(在OpenGL方面)是屬性

/ pos_x  \ 
| pos_y  | 
| pos_y  | 
| normal_x  | 
| normal_y  | 
| normal_z  | 
| color_r  | 
| color_g  | 
| color_b  | 
| color_a  | 
| texcoord0_s | 
| texcoord0_t | 
| texcoord0_r | 
| texcoord0_q | 
| texcoord1_s | 
| texcoord1_t | 
| texcoord1_r | 
| texcoord1_q | 
| …   | 
| texcoordN_s | 
| texcoordN_t | 
| texcoordN_r | 
| texcoordN_q | 
| …   | 
| attrib0  | 
| …   | 
\ attribM /

如果您更改這些你結束了一個完全不同的頂點的整個矢量。 OpenGL的數據模型的設計方式並不是可以將每個屬性放置在自己的數組中,並使用索引向量來處理它們。而且這種數據模型在實現高效緩存方面會造成很大的困難,所以會嚴重降低性能。

另外你還告訴你內存不足。大多數現代系統爲你提供幾千兆字節的圖形客戶端(即CPU)存儲器和至少幾百兆字節的圖形服務器(即GPU)存儲器。您可以放入GPU內存的幾何數據(即頂點)的數量超過了GPU的實時處理能力;這也將是比屏幕上可用的像素更多的頂點。所以我確信你不會遇到任何內存問題,你的瓶頸將是另一個問題。

3

如果您將Shademodel設置爲平滑,它將內插顏色。

glShadeModel(GL_SMOOTH);

或者你究竟想要達到什麼目的?緩衝區中的三角形只有一種顏色?這不起作用,你必須指定每個頂點的顏色...

+0

問題是一個頂點可能屬於幾個元素,用不同的顏色繪製。所以我需要重複頂點? – user898722

+0

是,重複頂點或更改顏色緩衝區。也許還有其他的可能性,比如使用着色器...我不知道這個.. – DeyyyFF

+0

謝謝你,我正在尋找「其他可能性」,因爲我在內存上非常有限。 – user898722