我有一个 CUDA 内核update,它以两个 float* 作为输入并更新第一个。更新后,我需要使用来自第一个指针的新数据从 OpenGL 更新 VBO。现在我一直在寻找一些 cuda-GL 互操作,但对我来说,所有这些都很难理解。我正在寻找一种干净且简单的方法来使用来自设备指针的数据来更新 VBO。我想象了这样的事情:
//initialize VBO
glGenBuffers(1, &vboID);
glBindBuffers(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*SIZE, (void*)0, GL_STREAM_DRAW);
cudaMalloc((void**)&positions, sizeof(float)*SIZE);
//per frame code
glBindBuffer(GL_ARRAY_BUFFER, vboID);
update<<<SIZE/TPB, TPB>>>(positions, velocities);
//somehow transfer the data from the positions pointer to the VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
CUDA/OpenGL 互操作的基本思想是您将使用 OpenGL 创建资源(例如 VBO、PBO 等)。使用 OpenGL,您将为该资源分配一个缓冲区。使用 CUDA/OpenGL 互操作,您将向CUDA注册该资源。在 CUDA 中使用该资源之前,您需要映射该资源,以获取指向 CUDA 可用的底层分配的指针。
然后,您可以使用 CUDA 对该分配进行操作,并且您可以通过取消映射资源将该资源“返回”给 OpenGL(用于进一步处理、显示等)。
对于 OpenGL VBO,API 序列可能如下所示:
// create allocation/pointer using OpenGL
GLuint vertexArray;
glGenBuffers( 1,&vertexArray);
glBindBuffer( GL_ARRAY_BUFFER, vertexArray);
glBufferData( GL_ARRAY_BUFFER, numVertices * 16, NULL, GL_DYNAMIC_COPY );
cudaGLRegisterBufferObject( vertexArray );
void * vertexPointer;
// Map the buffer to CUDA
cudaGLMapBufferObject(&ptr, vertexBuffer);
// Run a kernel to create/manipulate the data
MakeVerticiesKernel<<<gridSz,blockSz>>>(ptr,numVerticies);
// Unmap the buffer
cudaGLUnmapbufferObject(vertexBuffer);
// Bind the Buffer
glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer );
// Enable Vertex and Color arrays
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_COLOR_ARRAY );
// Set the pointers to the vertices and colors
glVertexPointer(3,GL_FLOAT,16,0);
glColorPointer(4,GL_UNSIGNED_BYTE,16,12);
glDrawArrays(GL_POINTS,0, numVerticies);
SwapBuffer();
Run Code Online (Sandbox Code Playgroud)
本演示文稿(例如从幻灯片 36 开始)概述了一般顺序。
该simpleGL CUDA代码示例给出了一个全面合作的例子。
| 归档时间: |
|
| 查看次数: |
2647 次 |
| 最近记录: |