[英]OpenGL can't update vertex buffer with VAO procedure
我試圖通過修改它的位置頂點屬性來移動一個頂點。 作為測試,我添加了行vertices[0] = 0.4f;
在創建我的 VAO 程序之前和之后,查看我是否能夠在初始渲染后修改頂點數組。 當我在創建 VAO 之前添加它時,它會修改頂點的位置,而在之后添加它時不會。 這讓我相信我的渲染過程:
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
不知何故,實際上並沒有用 memory 中的當前float[]
更新緩沖區。 但是,我可以替換行glBindVertexArray(VAO);
整個渲染過程:
// 2. copy our vertices array in a buffer for OpenGL to use
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
// 2. copy our vertex indices in a buffer for OpenGL to use
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(indices), indices);
// 3. then set our vertex attributes pointers:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)0); // Pos vec3
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)(3* sizeof(float))); // Col vec4
glEnableVertexAttribArray(1);
以此作為我的渲染過程,我可以更新頂點數組,並將此更改傳遞到 GPU,更新屏幕上頂點的 position。 這是我的 VAO 創建代碼:
// Generate a Vertex Array Object to store our rendering procedure.
unsigned int VAO;
glGenVertexArrays(1, &VAO);
// 1. bind Vertex Array Object, Element Buffer Object
glBindVertexArray(VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
// 2. copy our vertices array in a buffer for OpenGL to use
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
// 2. copy our vertex indices in a buffer for OpenGL to use
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(indices), indices);
// 3. then set our vertex attributes pointers:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)0); // Pos vec3
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)(3* sizeof(float))); // Col vec4
glEnableVertexAttribArray(1);
所以當我明確表達渲染過程時它可以工作,但當我將它存儲在 VAO 中時它不起作用? 據我了解,VAO 是用於存儲渲染過程的構造,然后當我們運行glBindVertexArray(VAO);
,執行此渲染過程。 我理解錯了嗎? 在創建 VAO 或渲染時是否需要另一條線?
這是 C++ 中的完整源代碼: https://pastebin.com/DgZuZt4K
和用 OpenTK 寫的一樣,C#: https://pastebin.com/DHj9UN16
[...] 據我了解,VAO 是一種用於存儲渲染過程的構造,[...]
不它不是。 頂點數組 Object存儲狀態。
當glBufferData
/ glBufferSubData
時,緩沖區對象的數據存儲被初始化,分別更新。
當調用glVertexAttribPointer
時,狀態會在 VAO 的 state 向量中設置。 當前綁定到目標GL_ARRAY_BUFFER
的緩沖區 object 與當前綁定的 VAO 中的指定頂點屬性相關聯。
VAO 存儲有關如何解釋每個屬性的頂點信息和 VBO 的 id 的信息。
但是VAO不存儲過程甚至進程。 更改頂點后,您必須通過glBufferSubData
或緩沖區映射更新頂點緩沖區 Object 。
如果要指定並啟用頂點屬性( glVertexAttribPointer
/ glEnableVertexAttribArray
),則必須綁定 VAO 和 VBO。 VAO 存儲規范,VBO 的 id 存儲在 VAO 中。
如果要更新頂點坐標和屬性(例如glBufferSubData
),則必須綁定 VBO。
如果你想繪制網格(例如glDrawArrays
),那么綁定 VAO 就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.