无法创建多个VAO

时间:2014-11-20 04:44:23

标签: opengl vao

我正在尝试使用现代(3.3)OpenGL创建一个简单的图形系统,以用于游戏。动态对象将具有动态几何,只要有变化,VBO就会更新。这部分很容易实现。只要只使用一个VAO,一切都运行良好,进一步调用glGenVertexArrays不会创建另一个对象(打印第一个和第二个ID都返回1)以及VAO初始化中的新对象呈现的内容呈现第一个无法执行任何编辑。每一个"现代OpenGL"教程要么只使用一个对象,要么有一些非常重要的冲突(最常见的是使用glVertexAttribPointer)。以下代码涉及对象的图形系统。 (不知道这有多重要,但我正在使用glfw3进行窗口和上下文创建)。

Init Game Object(图形片段)

glGenVertexArrays(1, &vertexArrayID);
glBindVertexArray(vertexArrayID);
glGenBuffers(1, &vertexCoordBufferID);
glBindBuffer(GL_ARRAY_BUFFER, vertexCoordBufferID);
glBufferData(GL_ARRAY_BUFFER, 2000 * 3 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(0);
allocatedVerticies = 2000;

更新网格

    //generate mesh
std::vector<float> vertices;
vertices.reserve(voxels.size() * 3 * 12);

//Vertices are added to the vector. This part works. Removed this code for clarity.


vertexCount = vertices.size() / 3;
glBindVertexArray(vertexArrayID);
glBindBuffer(GL_ARRAY_BUFFER, vertexCoordBufferID);
if (allocatedVerticies < vertexCount)
{
    //reallocate the buffers
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    allocatedVerticies = vertexCount;
}
else
{
    /////////////////////////////
    //reallocate the buffers- originally a reallocation was not going to be used, but glBufferSubData does not work
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    allocatedVerticies = vertexCount;


    ////////////////////////////////////////this does not work for some reason
    //reset data
    //glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.size() * sizeof(float), vertices.data());
}
edited = false;

渲染对象

glBindVertexArray(vertexArrayID);
glDrawArrays(GL_TRIANGLES, 0, vertexCount);

如果有更多有OpenGL经验的人可以指出我的错误,(或其他一些问题),这将是非常棒的。

1 个答案:

答案 0 :(得分:0)

在您提供的代码中,我看不到任何可能导致此类行为的内容。 Maby你应该提供与渲染相关的整个解决方案,以便更好地了解你的程序中发生了什么?

顺便说一下:如果你已经为你的buf定义了glVertexAttribPointer(),那么每当你更新存储在vertexCoordBufferID 中的数据时你就不必这样做了不要更改数据布局及其类型。而不是:

vertexCount = vertices.size() / 3;
glBindVertexArray(vertexArrayID);
glBindBuffer(GL_ARRAY_BUFFER, vertexCoordBufferID);
if (allocatedVerticies < vertexCount)
{
    //reallocate the buffers
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    allocatedVerticies = vertexCount;
}

您可以使用:

vertexCount = vertices.size() / 3;
glBindBuffer(GL_ARRAY_BUFFER, vertexCoordBufferID);
if (allocatedVerticies < vertexCount)
{
    //reallocate the buffers
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
    allocatedVerticies = vertexCount;
}