使用FreeGLUT和CUDA进行像素绘制时出现空白白屏

Blank white screen while pixel drawing using FreeGLUT and CUDA?

本文关键字:空白 白屏 绘制 像素 FreeGLUT CUDA 使用      更新时间:2023-10-16

我不知道发生了什么。只有我知道,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上也没有反应,它只是白色的。我可以调整窗口的大小,如果我让它变大,黑场就会消失,如果我让它变小,白色就会被删除。我试图找出为什么它只是白色而什么也没发生,但只有一个顶点绘制问题,他们的解决方案是设置投影矩阵。

为什么它给我一个空白的白屏?

附言 CUDA 代码正在工作,我有经验,所以它必须正常工作。我几乎从它工作的项目中复制粘贴了它。我已经检查了所有内容,但一切都很完美,我什至复制了一个库,所以它是相同的项目,但代码不同。

这是我

见过的最愚蠢的错误。我错过了订单!

我只是像这样制作了过剩的初始化:

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() 以让 glut 在完成后(当它达到这一点时)重绘。

所以现在 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 代码是有效的......至少以某种方式...