如何使用CUDA interop渲染球体?

时间:2012-05-13 22:45:33

标签: opengl cuda

我有很多球体。我做了一个cudamemcpy并将质量位置,电荷,初始速度和半径传送到设备。我计算所有球体之间的相互作用并计算最终位置。我的问题是我想渲染这些球体

GLuint vbo[2];
glGenBuffers( 2, vbo);
glBindBuffer( GL_ARRAY_BUFFER, vbo[0]);

unsigned int size = numBodies * 4 * sizeof( float);
float4* initialpos = (float4*)malloc(numBodies*4*sizeof(float));
for(unsigned int i = 0; i < numBodies; i++)
{
    // Initialize initialpos which are the centers of the spheres
}

glBufferData( GL_ARRAY_BUFFER, size, initialpos, GL_DYNAMIC_DRAW);

free(initialpos);

glBindBuffer( GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
glBindBuffer( GL_ARRAY_BUFFER, 0);
// register vbo with CUDA
cudaGLRegisterBufferObject(vbo[0]);
cudaGLRegisterBufferObject(vbo[1]);

//inside the display function
float4* oldPos;
float4* newPos;
cudaGLMapBufferObject( (void**)&newPos, vbo[1-swap])
cudaGLMapBufferObject( (void**)&oldPos, vbo[swap]);
 //Call  a C function which calls LAUNCHES CUDA KERNEL with old and new Positions 
 // Unmap Buffer Objects
swap = 1 - swap;

我在内核中更改newpos和oldPos。现在我要画点 使用glDrawElements(GL_POINTS,.....);

我的问题是我如何使用这些数据绘制球体,因为newpos数组的4个字节中的每一个都具有球体的中心,而不是类似“GL_SPHERES”之类的GL_POINTS。

1 个答案:

答案 0 :(得分:2)

OpenGL中没有“GL_SPHERES”这样的东西,只是让你画一个球体。您可能希望使用点精灵和GLSL着色器对球体进行光线追踪。总体思路描述如下:

Stefan Gumhold:使用深度校正来照亮发光的椭圆体。 VMV 2003。

顺便说一句:这是目前渲染大量球形粒子的最快方法,它将为您提供完美的球体。 Nvidia GPU Computing SDK中的“粒子”演示类似于渲染粒子球体。但是,在Nvidia演示中,球体可能不会重叠,因为由于深度值均匀,它不能处理球体 - 球体交叉点!