使用OpenGL进行动画处理,使用CUDA进行计算

时间:2014-08-25 10:23:16

标签: opengl cuda interop

我写了一个CUDA随机漫步模拟。即我有两个向量X和Y,包含我模拟的所有粒子的位置。在每个时间步长期间,我根据我的计算更新它们的位置。

/* Calculate velocity magnitude */
CURAND_CALL(curandGenerateNormal(gen, dev_v, Nrand,0,1.0));
/* Generate direction on device */
CURAND_CALL(curandGenerateUniform(gen, dev_alpha, Nrand));
/* X_t+1 = X_t + V */
scosaxpy<<<blocksPerGrid,threadsPerBlock>>>(Nrand,dev_alpha,dev_v,dev_x);
ssinaxpy<<<blocksPerGrid,threadsPerBlock>>>(Nrand,dev_alpha,dev_v,dev_y);

sscosaxpy()将我的位置更新为x+=cos(alpha)*vx。然后我的代码结构为

/* initilize memory */
/* set up CURAND */

for(t=0;t<T;t++){
   /* calculate velocity magnitude and direction */
   /* update position */
   /* eventually copy memory to host */
}

现在出现了我没有背景的部分。用OpenGL进行可视化。我查了一些例子(NVIDIA也为CUDA和OpenGL之间的交互提供了一些例子),但是大多数都是复杂的,或者不处理由CUDA完成计算的情况。

我的问题:任何人都可以通过以下方式向我提供可视化输出的步骤

for(t=0;t<T;t++){
   /* calculate velocity magnitude and direction */
   /* update position */
   /* eventually copy memory to host */

   /* Update the position of my particles in a 2D plot */
}

你能提供一个完整的工作实例吗?

1 个答案:

答案 0 :(得分:1)

在OpenGL中有很多方法可以做到这一点。它们的复杂性和性能各不相同。由于您使用的是CUDA,我相信您希望自己的可视化运行速度非常快。这比仅仅渲染这些点而不考虑性能要复杂一些。如果您之前没有OpenGL经验,我建议您使用最简单的解决方案,在此处绘制一个点。看看这个教程(它只是一个例子。你可以尝试任何有工作代码的教程):http://openglsamples.sourceforge.net/triangle.html

尝试运行它并看到一个三角形。现在找到一个display()函数,看看负责绘图的代码放在glBegin(GL_TRIANGLES)之间;和glEnd();

您需要修改它,因为您不想绘制三角形。相反,这是你应该做的。在CUDA步骤之后,我期待你拥有一系列3D点。

for(t=0;t<T;t++){
   /* calculate velocity magnitude and direction */
   /* update position */
   /* eventually copy memory to host */
}

/* Now your points are stored in an array. Let's say float particles[T][3]; */
/* Update the position of my particles in a 2D plot */
display();

您应该修改我已经提到的display()部分:

glBegin(GL_POINTS);
    for(int t=0;i<T;t++)
    {
        glColor3f(1.0f,1.0f,1.0f);  //In case you want to give them unique colors in future     
        glVertex3f( particles[t][0], particles[t][1], particles[t][2]);
    }                               
glEnd();

现在你应该看到你的粒子。如果数字T相对较高,渲染可能会很慢,但只是为了描绘粒子所在的位置,它就足够了。请记住,粒子的位置必须在摄像机的视角中,其中cas位于点(0,0,3)并且在Z轴的负方向上看具有45度视角。