2012-05-13 50 views
0

我有大量的領域。我做一個cudamemcpy並將質量位置,電荷,初始速度和半徑傳送到設備。我計算所有球體之間的相互作用並計算最終位置。我的問題是我想渲染這些領域如何使用CUDA interop渲染球體?

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_POINTS類似「GL_SPHERES」的球體的中心。

+1

你看看CUDA SDK示例SimpleGL。它使用cuda在緩衝區中渲染,然後使用opengl繪製結果。 – geek

回答

2

有是在OpenGL簡單地讓你畫一個球體「GL_SPHERES」沒有這樣的事。您可能想要使用點精靈和GLSL着色器來光線追蹤球體。

斯特凡Gumhold:與深度校正潑灑照明橢球的總體思路中描述。 2003年VMV

順便說一句:這是目前呈現大量球形顆粒的最快途徑,它會給你完美的球體。 Nvidia GPU Computing SDK中的「粒子」演示與渲染粒子球類似。但是,在Nvidia演示中,這些球體可能不會重疊,因爲由於統一的深度值,它不能處理球體相交!