0

语境

出于科学目的,我正在使用 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:我喜欢保持代码干净,所以我宁愿将显示问题与蜂群内核分开。

4

1 回答 1

1

我相信您可以使用几何着色器(在 OpenGL 3.2 中可用)来做到这一点。有关特定信息,请参阅本教程

在您的情况下,您需要将几何着色器的输入类型和输出类型分别设置为 GL_POINTS 和 GL_TRIANGLES,并在几何着色器中为每个传入点顶点发出三角形的 3 个顶点。

于 2011-01-24T11:53:12.093 回答