只能看到单个白点CUDA/OpenGL互操作
问题描述:
我试图将C++代码转换为CUDA代码,用于从外部文件读取数据并绘制3D矩阵的程序。我一次只转换一些代码片段,并且未能尝试绘制仅由红色点组成的小型3D矩阵。我只能看到一个白点,代码如下:只能看到单个白点CUDA/OpenGL互操作
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
GLuint bufferObj;
cudaGraphicsResource *resource;
int size=5*5*7;
int window_dim=600;
__global__ void kernel(float4 *ptr, int sizei) {
const unsigned long int blockId = blockIdx.x //1D
+ blockIdx.y * gridDim.x //2D
+ gridDim.x * gridDim.y * blockIdx.z; //3D
const unsigned long int threadId = (blockId * blockDim.x + threadIdx.x);
if(threadId<sizei) {
ptr[threadId].x=threadIdx.x+0.5f;
ptr[threadId+sizei].x=1.0f;
ptr[threadId].y=blockIdx.y+0.5f;
ptr[threadId+sizei].y=0.0f;
ptr[threadId].z=blockIdx.z+0.5f;
ptr[threadId+sizei].z=0.0f;
ptr[threadId].w=1.0f;
ptr[threadId+sizei].w=1.0f;
}
}
static void key_func(unsigned char key, int x, int y) {
switch (key) {
case 27:
HANDLE_ERROR(cudaGraphicsUnregisterResource(resource));
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDeleteBuffers(1, &bufferObj);
exit(0);
}
}
static void draw_func(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt (2.5f, 2.5f, 10.0f, 2.5f, 2.5f, 3.5f, 0.0f, 1.0f, 0.0f);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glBindBuffer(GL_ARRAY_BUFFER, bufferObj);
glVertexPointer(4, GL_FLOAT, sizeof(float4), 0);
glColorPointer(4, GL_FLOAT, sizeof(float4), BUFFER_OFFSET(sizeof(float4)*size));
glPointSize(3.0);
glDrawArrays(GL_POINTS, 0, size);
glFlush();
glPopMatrix();
glutSwapBuffers();
}
static void reshape_func(int w, int h) {
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
glFrustum (-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 100.0f);
glMatrixMode (GL_MODELVIEW);
glutPostRedisplay();
}
int main(int argc, char **argv) {
cudaDeviceProp prop;
int dev;
float4 *g_vertex_buffer_data = new float4[size*2];
memset(&prop, 0, sizeof(cudaDeviceProp));
prop.major = 3;
prop.minor = 0;
HANDLE_ERROR(cudaChooseDevice(&dev, &prop));
HANDLE_ERROR(cudaGLSetGLDevice(dev));
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(window_dim, window_dim);
glutCreateWindow("Interop_test");
glGenBuffers(1, &bufferObj);
glBindBuffer(GL_ARRAY_BUFFER, bufferObj);
glBufferData(GL_ARRAY_BUFFER, sizeof(float4)*2*size, NULL, GL_DYNAMIC_DRAW);
HANDLE_ERROR(cudaGraphicsGLRegisterBuffer(&resource, bufferObj, cudaGraphicsMapFlagsNone));
HANDLE_ERROR(cudaGraphicsMapResources(1, &resource, NULL));
float4 *devPtr;
size_t sizePtr;
HANDLE_ERROR(cudaGraphicsResourceGetMappedPointer((void**)&devPtr, &sizePtr, resource));
dim3 dimBlock(5,1,1);
dim3 dimGrid(1,5,7);
kernel<<<dimGrid,dimBlock>>>(devPtr, size);
////////////Don't know if this is necessary/////////////////
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float4)*size, &devPtr[0].x);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(float4)*size,
sizeof(float4)*size, &devPtr[size].x);
/////////////////////////////////////////////////////////////////
HANDLE_ERROR(cudaGraphicsUnmapResources(1, &resource, NULL));
glEnable(GL_DEPTH_TEST);
glutKeyboardFunc(key_func);
glutDisplayFunc(draw_func);
glutReshapeFunc(reshape_func);
glutMainLoop();
}
我也尝试打印出devPtr,并且我得到正确的数据。
答
我发现哪个问题。我会回答我的问题,以便每个人都可以使用它。 只需编辑draw_func这样的:
static void draw_func(void) {
[...]
glBindBuffer(GL_ARRAY_BUFFER, bufferObj);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(4, GL_FLOAT, sizeof(float4), 0);
glColorPointer(4, GL_FLOAT, sizeof(float4), BUFFER_OFFSET(sizeof(float4)*size));
glPointSize(3.0);
glDrawArrays(GL_POINTS, 0, size);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
[...]
}
请记得回来的几天,接受这个,这样的问题脱落未应答队列。 – talonmies
好的!非常感谢你! –