语境
出于科学目的,我正在使用 GPU 编程(OpenCL 和 CUDA,但当然不是同时)进行群体模拟。我使用 OpenGL 进行显示。
目标
我想以最有效的方式在不同的位置和不同的方向上绘制相同的对象 - 即蜂群粒子,可以是一个简单的 2D 三角形 - N 次:
对象总是完全相同的
位置和方向在 GPU 上计算,因此存储在 GPU 内存中
粒子数 N 可以很大
当前解决方案
到目前为止,为了避免将数据发送回 CPU,我将位置和方向数组存储在 VBO 中并使用:
glBindBuffer(GL_ARRAY_BUFFER, position_vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, velocity_vbo);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, 0, 0);
glDrawArrays(GL_POINTS, 0, N);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
以颜色编码的速度绘制一组点,而无需将数组复制回 CPU。
我想做的是使用类似的方式绘制一个完整的对象而不是一个简单的点,即不将 VBO 复制回 CPU。
基本上,我想在 GPU 上存储对象的模型(显示列表?顶点数组?),并使用 GPU 上的位置和方向来绘制对象 N 次而不将数据发送回 CPU。
有可能吗?怎么做?否则,我该怎么做?
PS:我喜欢保持代码干净,所以我宁愿将显示问题与蜂群内核分开。