gpt4 book ai didi

c - 渲染一个包含两个 VBO 的 VAO

转载 作者:太空宇宙 更新时间:2023-11-04 02:33:19 25 4
gpt4 key购买 nike

我正在尝试在 OpenGL 3.3 的窗口中绘制两个三角形。我正在为窗口系统使用 GLFW 库。

据我了解,我应该有两个VBO(每个三角形一个)和包含这两个VBO 的一个VAO。我就是这么做的。

但是,我不知道应该调用什么来呈现这两个 VBO。事实上,无论我做什么,都只会绘制第一个 VBO(第一个三角形)。第二个从未出现。

int main()
{
GLFWwindow *window = setupWindow();
GLfloat triangle1Vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
GLfloat triangle2Vertices[] = {
0.f, -0.5f, 0.0f,
0.8f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
GLuint vao, vbo[2];

glGenVertexArrays(1, &vao);
glGenBuffers(2, vbo);

glBindVertexArray(vao);

glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1Vertices), triangle1Vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle2Vertices), triangle2Vertices, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glEnableVertexAttribArray(1);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

while (!glfwWindowShouldClose(window))
{
glfwPollEvents();

glClearColor(0.3f, 0.3f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);


glBindVertexArray(vao);

glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glDrawArrays(GL_TRIANGLES, 0, 3);

glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glDrawArrays(GL_TRIANGLES, 0, 3);

glBindVertexArray(0);


glfwSwapBuffers(window);
}

glDeleteVertexArrays(1, &vao);
glDeleteBuffers(2, vbo);

glfwTerminate();

return 0;
}

我显然漏掉了什么,但是什么?

最佳答案

From what I understand, I should have two VBOs (one for each triangle) and one VAO containing these two VBOs.

那你理解错了。

如果你想要两个不同的缓冲区和两个不同的三角形,那么你要么需要两个不同的 VAO,要么你需要交换 VAO 在渲染每个对象之间使用的缓冲区。

您的渲染代码接近正确,但不完全正确:

    glBindVertexArray(vao);

glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glDrawArrays(GL_TRIANGLES, 0, 3);

glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glDrawArrays(GL_TRIANGLES, 0, 3);

请注意,第二个 glVertexAttribPointer 调用也使用属性 0。您传递给 glVertexAttribPointer 的属性索引指定从该数组获取哪个着色器输入变量。您要做的是使用相同的着色器渲染第二个对象,仅更改顶点数组的来源。这需要使用相同的属性索引。

但是,如果您可以使用 OpenGL 4.3/ARB_vertex_attrib_binding,I would highly encourage you to just use those APIs .它使您的代码很多更直接:

//vertex setup
glGenVertexArrays(1, &vao);

glBindVertexArray(vao);
//Sets up the format, *without* a buffer object.
glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0);
//Sets up where the buffer object comes from
glVertexAttribBinding(0, 0);
//Enable VAO
glEnableVertexAttribArray(0);
//Done with VAO
glBindVertexArray(0);

//Set up buffer object data storage.
glGenBuffers(2, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1Vertices), triangle1Vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle2Vertices), triangle2Vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

然后,在你的循环中:

glBindVertexArray(vao);

//Use buffer 0 to render.
glBindVertexBuffer(0, vbo[0], 0, 3 * sizeof(float));
glDrawArrays(GL_TRIANGLES, 0, 3);
//Use buffer 1 to render.
glBindVertexBuffer(0, vbo[1], 0, 3 * sizeof(float));
glDrawArrays(GL_TRIANGLES, 0, 3);

glBindVertexArray(0);

关于c - 渲染一个包含两个 VBO 的 VAO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40652905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com