在更新相同的`GL_ARRAY_BUFFER`时,我可以多次调用`glDrawArrays`吗?

时间:2015-10-19 18:12:13

标签: c++ opengl rendering opengl-3

在一个框架中,是否允许"要不断更新相同的GL_ARRAY_BUFFER并在每次更新后继续致电glDrawArrays吗?

我知道这可能不是最好的,也不是最推荐的方式,但我的问题是:我是否可以执行此操作并期望在每次调用GL_ARRAY_BUFFER之前更新glDrawArrays

代码示例如下所示:

// setup a single buffer and bind it
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);

while (!renderStack.empty())
{
    SomeObjectClass * my_object = renderStack.back();
    renderStack.pop_back();

    // calculate the current buffer size for data to be drawn in this iteration
    SomeDataArrays * subArrays = my_object->arrayData();
    unsigned int totalBufferSize = subArrays->bufferSize();
    unsigned int vertCount = my_object->vertexCount();

    // initialise the buffer to the desired size and content
    glBufferData(GL_ARRAY_BUFFER, totalBufferSize, NULL, GL_STREAM_DRAW);

    // actually transfer some data to the GPU through glBufferSubData
    for (int j = 0; j < subArrays->size(); ++j)
    {
        unsigned int subBufferOffset = subArrays->get(j)->bufferOffset();
        unsigned int subBufferSize = subArrays->get(j)->bufferSize();
        void * subBufferData = subArrays->get(j)->bufferData();

        glBufferSubData(GL_ARRAY_BUFFER, subBufferOffset, subBufferSize, subBufferData);

        unsigned int subAttributeLocation = subArrays->get(j)->attributeLocation();

        // set some vertex attribute pointers
        glVertexAttribPointer(subAttributeLocation, ...);
        glEnableVertexAttribArray(subAttributeLocation, ...);
    }

    glDrawArrays(GL_POINTS, 0, (GLsizei)vertCount);
}

您可能会问 - 我为什么要这样做,而不是立即将所有内容预先加载到GPU上......好吧,明显的答案,因为当数据太多而无法解决时,我无法做到这一点39; t适合单个缓冲区。

我的问题是,我只能看到其中一个glDrawArrays来电(我相信是第一个)的结果,换句话说,它看起来好像是{{ 1}}在每次GL_ARRAY_BUFFER来电之前都没有更新,这让我回到了我的问题,如果可能的话。

我正在使用OpenGL 3.2 CoreProfile(在OS X下)并与GLEW链接进行OpenGL设置以及Qt 5以设置窗口创建。

1 个答案:

答案 0 :(得分:0)

是的,这是合法的OpenGL代码。这绝不是任何人都应该做的事情。但这是合法的。实际上,在你的情况下它更没意义,因为你为每个对象调用glVertexAttribPointer

如果您无法将所有顶点数据放入内存中,或者需要在GPU上生成顶点数据,那么您应该使用适当的buffer streaming techniques流式传输数据。