0

球がたくさんあります。私は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_POINTSの代わりに「GL_SPHERES」のような球の中心を持っているため、このデータを使用して球を描画する方法です。

4

1 に答える 1

2

OpenGL には、単純に球体を描画できる「GL_SPHERES」はありません。ポイント スプライトと GLSL シェーダーを使用して球体をレイトレーシングすることができます。一般的な考え方は、以下で説明されています。

Stefan Gumhold: 照明付き楕円体を深度補正でスプラッティング。VMV2003.

ところで、これは現在、多数の球状パーティクルをレンダリングする最速の方法であり、完全な球体が得られます。Nvidia GPU Computing SDK の「パーティクル」デモは、同様の処理を行ってパーティクル球をレンダリングします。ただし、Nvidia のデモでは、深度値が均一であるため、球と球の交差が処理されないため、球がオーバーラップしない場合があります。

于 2012-05-14T16:40:48.313 に答える