我的想法是什么。 只有我知道,freeglut因为我不知道的原因丢弃了我的代码。 我初始化它:
glutInit(argc, args);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(wnd_width, wnd_height);
glutDisplayFunc(_display);
glutTimerFunc(16, tick, 0);
glutCreateWindow(appName);
glutCloseFunc(close);
glutReshapeFunc(reshape);
if (glewInit() != GLEW_OK) return 2;
glGenBuffersARB(1, &_PBO);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, _PBO);
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, wnd_width*wnd_height*sizeof(GLubyte)* 4, 0, GL_STREAM_DRAW_ARB);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
cudaGraphicsGLRegisterBuffer(&PBOCUDA, _PBO, cudaGraphicsMapFlagsWriteDiscard);
unsigned int size = wnd_width * wnd_width * 4 * sizeof(float);
glutMainLoop();
然后我用两个函数绘制它:
++timeVar;
cudaGraphicsMapResources(1, &PBOCUDA, 0);
size_t num_bytes;
cudaGraphicsResourceGetMappedPointer((void **)&d_output, &num_bytes, PBOCUDA);
cudaTestWork1(timeVar, d_output, wnd_width, wnd_height);
cudaGraphicsUnmapResources(1, &PBOCUDA, 0);
display(wnd_width, wnd_height, _PBO);
并显示():
glClearColor(0.3f,0.3f,0.3f,0.3f);
glClear(GL_COLOR_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glRasterPos2i(0, 0);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, img);
glDrawPixels(x, y, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
glutSwapBuffers();
即使在glClearColor上它也没有反应,它只是白色。我可以调整窗口的大小,如果我把它做得更大,那么黑色区域就会变大,如果我把它缩小,白色就会被删除。我试图找到为什么它只是白色而没有任何反应,但只有一个顶点绘制问题,它们的解决方案是设置projectiong矩阵。
为什么它会给我一个空白的白色屏幕?
P.S。 CUDA代码正在运行,我有它的经验,所以它必须正常工作。 我几乎从它工作的项目中复制粘贴它。我检查了一切,但一切都很完美,我甚至复制了一个库,所以它是相同的项目,但代码不同。
答案 0 :(得分:0)
这是我见过的最愚蠢的错误。我错过了订单!
我刚刚做了这样的过剩:
glutInit(argc, args);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(wnd_width, wnd_height);
glutCreateWindow(appName); // goes first
glutDisplayFunc(_display); // then functions
glutCloseFunc(close);
glutReshapeFunc(reshape);
现在它有效!我们首先需要创建一个窗口,然后将函数应用于它。在display()中,我添加了glutPostRedisplay(),以便在完成后重写(当它到达这一点时)。
所以现在display()看起来像这样:
glClearColor(0.5f,0.5f,0.5f,.0f);
glClear(GL_COLOR_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glRasterPos2i(0, 0);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, img);
glDrawPixels(x, y, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
glutSwapBuffers();
glutPostRedisplay();
是的,正如我所说的那样,我的CUDA代码是有效的......至少在某种程度上......