gpt4 book ai didi

c++ - 在模拟中使用 GL_ARRAY_BUFFER 时屏幕锁定

转载 作者:行者123 更新时间:2023-11-28 08:13:44 25 4
gpt4 key购买 nike

我实现了一个显示粒子模拟的小型粒子模拟查看器。类似于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 文件)。

最佳答案

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

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

关于c++ - 在模拟中使用 GL_ARRAY_BUFFER 时屏幕锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8334204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com