【发布时间】:2014-06-01 02:40:35
【问题描述】:
我一般都学过 OpenGL 与 CUDA 的互操作性,但是我的问题是这样的:
我有很多数组,一些用于顶点,一些用于规范,一些用于单独的 alpha 值,还有一些指向设备内存上这些数组的指针(例如 dev_ver,dev_norm),它们在内核中使用。我已经映射了资源,现在我想在着色器中使用这些数据来制作一些效果。我的渲染代码是这样的:
glUseProgram (programID);
glBindBuffer (GL_ARRAY_BUFFER, vertexBuffer_0);
glBufferData(GL_ARRAY_BUFFER, size, _data_on_cpu_0, GL_DYNAMIC_DRAW);
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glBindBuffer (GL_ARRAY_BUFFER, vertexBuffer_1);
glBufferData(GL_ARRAY_BUFFER, size, _data_on_cpu_1, GL_DYNAMIC_DRAW);
glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glBindBuffer (GL_ARRAY_BUFFER, vertexBuffer_2);
glBufferData(GL_ARRAY_BUFFER, size, _data_on_cpu_2, GL_DYNAMIC_DRAW);
glVertexAttribPointer (2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray (0);
glEnableVertexAttribArray (1);
glEnableVertexAttribArray (2);
glDrawArrays (GL_TRIANGLES, 0, _max_);
glDisableVertexAttribArray (0);
glDisableVertexAttribArray (1);
glDisableVertexAttribArray (2);
但是,现在我没有_data_on_cpu_,还可以做同样的事情吗? cuda 6.0 中的示例是这样的:
glBindBuffer(GL_ARRAY_BUFFER, posVbo);
glVertexPointer(4, GL_FLOAT, 0, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, normalVbo);
glNormalPointer(GL_FLOAT, sizeof(float)*4, 0);
glEnableClientState(GL_NORMAL_ARRAY);
glColor3f(1.0, 0.0, 0.0);
glDrawArrays(GL_TRIANGLES, 0, totalVerts);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
我不完全了解这如何工作以及在我的情况下该怎么做。
顺便说一句,我使用的方法是 cudaMemcpy 将 dev_ 托管并像往常一样进行渲染,但这显然效率不高,因为当我进行渲染时,我再次通过 OpenGL 将数据发送回 GPU(如果我是正确的)。
【问题讨论】: