我实现了一个小粒子模拟查看器,它显示粒子模拟。与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文件)。
答案 0 :(得分:1)
glBufferData
(重新)初始化一个全新的缓冲区对象 - 就像glTexImage
重新初始化一个全新的纹理一样。
使用glBufferSubData
更新内容,而无需进行完整的对象分配。