我有一個包含座標的數組。它看起來像:VBO的頂點數組-OpenGL
glm::vec3* Vertices;
如何將其元素傳遞給glVertexAttribPointer。唯一的方法就是一維數組嗎?例如;我可以使用類似的東西:
float* Vertices[3];
我有一個包含座標的數組。它看起來像:VBO的頂點數組-OpenGL
glm::vec3* Vertices;
如何將其元素傳遞給glVertexAttribPointer。唯一的方法就是一維數組嗎?例如;我可以使用類似的東西:
float* Vertices[3];
讀我的答案之前:顯然,我的答案只有部分正確的,你可以使用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)
size
)type
)stride
)offset
)爲了簡單起見,我在此使用了glVertexPointer。
您可以在LWJGL維基
http://www.lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_%28VBO%29
這不一定是真的,你絕對必須在覈心配置文件上下文中使用VBOs,但在兼容性方面,實際上可以使用'glVertexAttribPointer(...)'指向客戶端內存。使用客戶端內存來處理頂點數據的一個主要缺點是GL要麼在執行'glDrawArrays(...)之前複製整個數組...)'命令或強制管道同步,以便在命令執行時不能更改數據。這就是爲什麼維也納國際組織提供更好的業績,並且是現代**(核心)總帳唯一的選擇。 –
這是我實際上不知道的。在答案中給您的評論添加提示。 – th3falc0n
對不起,我不是故意暗示你必須改變你答案中的任何主要內容。這是聲明你必須使用糾纏我的維也納國際組織。這是所有非常好的建議,而且維也納組織也是要走的路,但它們並不總是要求。此外,'glm'是一個C++模板庫(儘管問題沒有被標記爲這樣,我現在將解決這個問題),所以LWJGL可能不是最好的參考。 –
這是3'浮動*'的......這是行不通的數組找到維也納組織一個很好的教程。你想要的是一個足夠大的數組來容納3個頂點(繪製一個三角形),每個3'浮點數的長度......所以像:'Floating Vertices [9];'但是,老實說,'glm :: vec3'可能可以用作連續的內存塊,大多數這些類都是。所以'glm :: vec3'本身可能就是所有必需的。 –