C++/OpenGL - VAO 问题

标签 c++ opengl vbo vao

在学习了 VBO 之后,一位 friend 告诉我尝试使用 VAO 将立方体索引与顶点链接起来。我遵循了我能找到的每一个教程,但都无济于事。看起来缓冲区绑定(bind)正确,一切正常,直到我尝试绘制它们。

这就是我生成 VAO 的方式 -

glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);

glEnableVertexAttribArray(0);

glGenBuffers(1, &cubeIndex);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeIndex);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36 * sizeof(GLuint), cubeIndices, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_UNSIGNED_INT, GL_FALSE, sizeof(GLuint)*3, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

glEnableVertexAttribArray(1);

glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 21 * sizeof(GLfloat), cubeVertPoints, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, 0);

glBindVertexArray(0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

渲染-

glEnableClientState(GL_VERTEX_ARRAY);
glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES, 0, size);//Runtime exception here if anything larger that '2' is provided?

glBindVertexArray(0);

最佳答案

您的代码没有意义。您永远不会将任何内容绑定(bind)到 GL_ARRAY_BUFFER,因此您的 glVertexAttribPointer() 调用将指向无效的 VBO - 解释当您尝试绘制那个东西时发生的崩溃。

我不确定你想在这里做什么。看起来 cubeIndex 应该是用于索引渲染的元素数组。但是您似乎尝试将索引用作顶点属性。但是您应该将其用作 GL_EMEMENT_ARRAY_BUFFER(正如您已经在做的那样)与 glDrawElements()(您不做的)一起使用。您的 cubeVBO 应该是一个 GL_ARRAY_BUFFER,您应该将其用作顶点属性。

数组的大小也看起来很奇怪。当绘制一个有 6 个边且每个边有 2 个三角形的立方体时,36 个 Uint 作为索引缓冲区确实有意义。但是顶点数据的 21 个 float (每个 vector 有 3 个分量)只有 7 个顶点 - 对于立方体来说很奇怪。

请看Vertex SpecificationVertex Rendering OpenGL wiki 中的页面,或查看一些教程 - 您到目前为止发布的代码让我认为您没有掌握基本概念。

关于C++/OpenGL - VAO 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21814711/

相关文章:

c++ - 可以在 C++ 中的字符串文字中写入 unicode 字符吗

iphone - 是否可以在顶点着色器内持续更改 iPhone OpenGL ES 2.0 上 VBO 的值?

c++ - OpenGL 绘制顶点缓冲区对象

OpenGL:渲染一批几何体的有效方法?

c++ - RAD Studio ADO数据集加载数据慢

c++ - 享元模式和 C++ 模板

c++ - 如何修复 Gstreamer 以捕获麦克风音频并缓冲或转储为原始文件,当我说话时它不保存任何内容

opengl - Rust、OpenGL - 距离在代码中相等,但在绘制后不相等

opengl - 如何在OpenGL中实现没有重复顶点的平面着色?

opengl - DirectX/Cuda/OpenGL 的总/纹理可访问内存