在模拟中使用GL_ARRAY_BUFFER时,屏幕锁定

时间:2011-11-30 22:55:35

标签: c++ c opengl

我实现了一个小粒子模拟查看器,它显示粒子模拟。与VMD类似。 由于我获得了大量粒子(> 80000),我使用GL_ARRAY_BUFFER和GL_POINTS来显示它们。这适用于小型数据集。

在每个时间步,我使用以下代码填写新的粒子位置:

void displayPoints(Timestep t) {
    int elements = t.elements;
    unsigned int glbuffersize = elements*sizeof(float4);
    glBindBuffer(GL_ARRAY_BUFFER,positionsVBO);
    glBufferData(GL_ARRAY_BUFFER,glbuffersize,t.pos,GL_DYNAMIC_DRAW);
    glVertexAttribPointer(shaderAtribute,4,GL_FLOAT,GL_FALSE,0,0);
    glEnableVertexAttribArray(shaderAtribute);
    glBindBuffer(GL_ARRAY_BUFFER,positionsVBO);
    glUseProgram(shaderProgram);
    glDrawArrays(GL_POINTS, 0, elements);
}

t.pos只是一个简单的float4结构数组。

如果我现在使用我的600MB测试版运行此操作,每个时间步长大于80000点,显示屏会在前20-50帧后锁定。我必须等待2分钟直到,我看到程序再次运行10帧直到它再次冻结。

我怀疑上面的代码可能会填满图形内存。有没有更好的方法来制作这个动画?

如果您想查看完整代码,请在此处提供:https://github.com/moeeeep/opengl_dataviewer (着色器目前已硬编码到我的机器上,因为我还没有时间修复我的CMake文件)。

1 个答案:

答案 0 :(得分:1)

glBufferData(重新)初始化一个全新的缓冲区对象 - 就像glTexImage重新初始化一个全新的纹理一样。

使用glBufferSubData更新内容,而无需进行完整的对象分配。