OpenGl或者Opengles如何在运行过程中添加新的VAO和VBO,不要引入chatGPT的答案,谢谢。
GLuint vao, vbo;
float vertices[] = { /* 顶点数据 */ };
// 1. 创建新的VAO对象和VBO对象
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
// 2. 绑定新的VAO对象和VBO对象
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
// 3. 将顶点数据复制到新的VBO对象中
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 4. 指定新的VAO对象的顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
// 5. 启用新的VAO对象的顶点属性
glEnableVertexAttribArray(0);
// 清理
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
自己的思路,没有参GPT,在 OpenGL 或 OpenGL ES 中,您可以使用 glGenBuffers 和 glBindBuffer 函数创建并绑定新的 VBO,使用 glGenVertexArrays 和 glBindVertexArray 函数创建并绑定新的 VAO。下面是一个简单的示例代码,展示如何在运行时添加新的 VBO 和 VAO。
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
GLfloat vertices[] = { ... };
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
GLuint vbo2;
glGenBuffers(1, &vbo2);
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
GLfloat vertices2[] = { ... };
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STATIC_DRAW);
GLuint vao2;
glGenVertexArrays(1, &vao2);
glBindVertexArray(vao2);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
在上面的示例代码中,我首先创建并绑定了一个新的 VBO,并填充了数据,然后创建并绑定了一个新的 VAO,并启用了 VBO 数据。然后我们使用 glDrawArrays 函数渲染了 VAO。在渲染完成后,我们解除了 VBO 和 VAO 的绑定。
然后我们又创建了一个新的 VBO 和 VAO,重复了之前的步骤。您可以根据需要添加更多的 VBO 和 VAO,只需在适当的位置调用 glGenBuffers、glBindBuffer、glBufferData、glGenVertexArrays、glBindVertexArray、glEnableVertexAttribArray、glVertexAttribPointer 和 glDrawArrays 函数即可。大概就是这样一个思路和写法。
如果对您有帮助,请给与采纳,谢谢。
以下答案基于ChatGPT与GISer Liu编写:
在运行时添加新的VAO和VBO需要以下步骤:
① 创建新的VAO和VBO对象。
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
// 然后设置VAO和VBO的属性
② 通过OpenGL函数将数据存储到VBO中。
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
③ 激活新的VAO和VBO对象。
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
④ 通过OpenGL函数绘制新的VAO和VBO。
glDrawArrays(GL_TRIANGLES, 0, numVertices);
⑥ 最后,记得在不需要时删除VAO和VBO对象。
glDeleteVertexArrays(1, &vao);
glDeleteBuffers(1, &vbo);
需要注意的是,VAO和VBO对象需要在OpenGL上下文中创建和使用,因此需要在正确的线程中执行这些操作。另外,添加新的VAO和VBO对象可能会影响性能,因此应该根据实际情况进行优化。
在Opengl中生成VBO和VAO一般是这样的:
unsigned int VBO, VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
如果以上解决方法您还是没有解决您的问题。这里帮你找到一些关于Opengl的中英文教程,您可以在看下这个资料,或许会有思路:
https://blog.51cto.com/u_15295315/3042716
在OpenGL或OpenGL ES中,您可以在运行时动态添加新的VAO(Vertex Array Object)和VBO(Vertex Buffer Object)。
要添加一个新的VAO,您需要执行以下步骤:
1生成一个新的VAO对象,使用glGenVertexArrays()函数。
2绑定新的VAO对象,使用glBindVertexArray()函数。
3为新的VAO对象设置顶点属性指针,使用glVertexAttribPointer()函数。
4启用新的VAO对象的顶点属性,使用glEnableVertexAttribArray()函数。
以下是一个示例代码片段,用于动态添加新的VAO
// 生成新的VAO对象
GLuint newVAO;
glGenVertexArrays(1, &newVAO);
// 绑定新的VAO对象
glBindVertexArray(newVAO);
// 设置新的VAO对象的顶点属性指针
glVertexAttribPointer(...);
// 启用新的VAO对象的顶点属性
glEnableVertexAttribArray(...);
要添加一个新的VBO,您需要执行以下步骤:
1生成一个新的VBO对象,使用glGenBuffers()函数。
2绑定新的VBO对象,使用glBindBuffer()函数。
3分配VBO对象的内存空间,并将数据复制到该空间中,使用glBufferData()函数。
以下是一个示例代码片段,用于动态添加新的VBO:
// 生成新的VBO对象
GLuint newVBO;
glGenBuffers(1, &newVBO);
//
可以使用OpenGL或者OpenGLES内置函数来创建VAO和VBO,并将需要的顶点和属性数据(颜色、文理坐标、法线等)传递给VBO。使用glBindBuffer函数绑定生成的VBO,然后运用glVertexAttribPointer函数将VBO与VAO关联。同时,也可以利用glGenVertexArrays和glGenBuffers函数,分别生成VAO和VBO。最后使用glBindVertexArray函数将VAO与VBO绑定,就可以在运行过程中添加新的VAO和VBO。