使用 FreeGLUT 和 CUDA 绘制像素时出现空白屏幕?

Blank white screen while pixel drawing using FreeGLUT and CUDA?

我不知道发生了什么。 只有我知道,由于我不知道的原因,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 上也没有反应,它只是白色。我可以调整窗口大小,如果我把它变大,黑色区域就会出现,如果我把它变小,白色就会被擦除。我试图找到为什么它只是白色而没有任何反应,但只有顶点绘制问题,解决它们的方法是设置投影矩阵。

为什么我的屏幕是空白的?

P.S。 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);

现在可以使用了!我们需要先创建一个 window 然后对其应用函数。在 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 代码是有效的……至少在某种程度上……