簡體   English   中英

OpenGL 無法使用 VAO 程序更新頂點緩沖區

[英]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

相關: 修改 OpenGL 頂點緩沖區的正確方法是什么?


如果要指定並啟用頂點屬性( glVertexAttribPointer / glEnableVertexAttribArray ),則必須綁定 VAO 和 VBO。 VAO 存儲規范,VBO 的 id 存儲在 VAO 中。

如果要更新頂點坐標和屬性(例如glBufferSubData ),則必須綁定 VBO。

如果你想繪制網格(例如glDrawArrays ),那么綁定 VAO 就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM