【问题标题】:C++/OpenGL - VAO ProblemsC++/OpenGL - VAO 问题
【发布时间】:2014-02-16 17:24:45
【问题描述】:

在了解了 VBO 之后,一位朋友告诉我尝试使用 VAO 将立方体索引与顶点链接起来。我遵循了几乎所有我能找到的教程,但无济于事。看起来缓冲区绑定正确,一切正常,直到我尝试绘制它们。

这就是我生成 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);

【问题讨论】:

    标签: c++ opengl vbo vao


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我是否需要调用 glEnableVertexAttribArray(1);有吗?
    • @tcoy:取决于属性 1 是什么。在您的情况下,您似乎只需要一个属性,该属性通常会绑定到索引 0。
    • 我阅读了 wiki 文章和 OpenGL 参考页面,并修复了我的代码。每当我调用 glEnableVertexAttribArray() 时,它都会导致运行时错误,但是当我删除它时,程序运行但不绘制任何东西
    • @tcoy:好吧。如果您不启用任何阵列,则您的 VBO 并没有真正使用。如果启用它时它崩溃,则说明您的属性指针未正确设置。如果没有看到实际代码,很难判断会发生什么......
    • 谢谢。事实证明,我的顶点数组/facepalm 中缺少两个逗号。我现在有点工作,它类似于一个立方体,但是我的索引不正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多