2014-01-07 120 views
0

我有一個包含座標的數組。它看起來像:VBO的頂點數組-OpenGL

glm::vec3* Vertices; 

如何將其元素傳遞給glVertexAttribPointer。唯一的方法就是一維數組嗎?例如;我可以使用類似的東西:

float* Vertices[3]; 
+0

這是3'浮動*'的......這是行不通的數組找到維也納組織一個很好的教程。你想要的是一個足夠大的數組來容納3個頂點(繪製一個三角形),每個3'浮點數的長度......所以像:'Floating Vertices [9];'但是,老實說,'glm :: vec3'可能可以用作連續的內存塊,大多數這些類都是。所以'glm :: vec3'本身可能就是所有必需的。 –

回答

2

讀我的答案之前:顯然,我的答案只有部分正確的,你可以使用glVertexAttribPointer無需手動寫入GRAM而是使用客戶端的內存,但它仍然是最好使用VBOs而不是使用這種方法。

你不會傳遞給glVertexAttribPointer。在與glBindBuffer綁定一個緩衝區後,您必須首先使用glBufferData將其寫入GRAM。 glVertexAttribPointer只會描述在這個綁定緩衝區中的數據將被找到的位置。這裏有一點表明你可以將任何你想要的數據傳遞給GRAM。如果你有你的vec3數組(我假設vec3只包含浮點數x,y和z),那麼你的數組的內存將看起來像x1, y1, z1, x2, y2, z2, x3, y3, z3等等。如果這寫到你的GRAM中,你將不得不指定這個數據,以便你的GPU知道該怎麼做。例如:

glBindBuffer(GL_ARRAY_BUFFER, bufferID); 

bufferID必須在之前分配(glGenBuffers)。

glBufferData(GL_ARRAY_BUFFER, 36, vertices, GL_STATIC_DRAW); 

寫入GL_ARRAY_BUFFER(使用glBindBuffer)綁定的緩衝區。寫36個字節(float = 4bytes,1個頂點只有位置= 3個浮點數,1個三角形= 3個頂點,總計最多36個字節,用於1個三角形)。GL_STATIC_DRAW表示我們將寫入一次,然後只繪製它。

glVertexPointer(3, GL_FLOAT, 0, 0) 
  • 你必須每頂點3個座標(size
  • 它們是浮標(GL_FLOAT,type
  • 您有在緩衝器的sizeof(浮點)一整個數據集12字節長度* 3並且因爲您只使用單個指針,所以當您傳遞0(元素* typesize)時,它可以計算自身的步幅(stride
  • 並且它們從緩衝區的開始處開始(0,offset

爲了簡單起見,我在此使用了glVertexPointer。

您可以在LWJGL維基

http://www.lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_%28VBO%29

+1

這不一定是真的,你絕對必須在覈心配置文件上下文中使用VBOs,但在兼容性方面,實際上可以使用'glVertexAttribPointer(...)'指向客戶端內存。使用客戶端內存來處理頂點數據的一個主要缺點是GL要麼在執行'glDrawArrays(...)之前複製整個數組...)'命令或強制管道同步,以便在命令執行時不能更改數據。這就是爲什麼維也納國際組織提供更好的業績,並且是現代**(核心)總帳唯一的選擇。 –

+0

這是我實際上不知道的。在答案中給您的評論添加提示。 – th3falc0n

+0

對不起,我不是故意暗示你必須改變你答案中的任何主要內容。這是聲明你必須使用糾纏我的維也納國際組織。這是所有非常好的建議,而且維也納組織也是要走的路,但它們並不總是要求。此外,'glm'是一個C++模板庫(儘管問題沒有被標記爲這樣,我現在將解決這個問題),所以LWJGL可能不是最好的參考。 –