在某些机器上的OpenGL黑屏(PIXELFORMATDESCRIPTOR/SwapBuffer?)

Black screen in OpenGL on some machines (PIXELFORMATDESCRIPTOR/SwapBuffer?)

本文关键字:PIXELFORMATDESCRIPTOR SwapBuffer 黑屏 OpenGL 机器      更新时间:2023-10-16

我写了一个OpenGL应用程序,它会在一些机器上崩溃(在我自己的测试机器上运行:Windows 8, Windows 7, Windows Vista (x86) -但在一些客户端机器上Windows Vista (x86)它崩溃)-我不知道为什么,但我把应用程序降级为一个空骨架,这将只做glClear()。然后,应用程序运行至少没有崩溃(可以创建OpenGL上下文,可以加载glow),但屏幕不会以指定的glClearColor颜色清除。我怀疑我的PIXELFORMATDESCRIPTORSwapBuffer中的一些问题不像预期的那样在那里工作。

我的代码(为了简单起见,我省略了windows创建和main()):

hdc = GetDC(hWnd);
int   pf;
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(pfd));
pfd.nSize  = sizeof(pfd);
pfd.nVersion  = 1;
pfd.dwFlags   = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
pfd.iPixelType   = PFD_TYPE_RGBA;
pfd.cColorBits   = 32;
pf = ChoosePixelFormat(hdc, &pfd);
if (pf == 0) {
  MessageBox(NULL, "ChoosePixelFormat() failed:  "
 "Cannot find a suitable pixel format.", "Error", MB_OK); 
} 
if (SetPixelFormat(hdc, pf, &pfd) == FALSE) {
  MessageBox(NULL, "SetPixelFormat() failed:  "
 "Cannot set format specified.", "Error", MB_OK);
} 
DescribePixelFormat(hdc, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
hglrc = wglCreateContext(hdc);
if(!wglMakeCurrent(hdc, hglrc)){
  MessageBox(NULL, "wglMakeCurrent() failed:  "
 "Cannot make context current.", "Error", MB_OK); 
}
GLenum err = glewInit();
if (GLEW_OK != err){
  /* Problem: glewInit failed, something is seriously wrong. */
  fprintf(stdout, "Error: %sn", glewGetErrorString(err));
}
fprintf(stdout, "Status: Using GLEW %sn", glewGetString(GLEW_VERSION));

此代码输出:"Status: Using GLEW 1.10.0"然后我的主循环:

while(true){
  timeDuration = std::chrono::duration_cast<std::chrono::duration<double> >(std::chrono::high_resolution_clock::now() - lastTime);
  lastTime = std::chrono::high_resolution_clock::now();
  time += timeDuration.count();
  glClearColor(0.7f, 0.7f, 0.7f, 1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  SwapBuffers(hdc);
  while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
} 

在我自己的机器上,我收到一个灰色的屏幕(如预期的那样)-但是在我的原始程序崩溃的机器上,屏幕只是黑色的(但是没有出现任何消息框,输出也是:"状态:使用GLEW 1.10.0")。所以我看不到任何错误的证据-但是输出是不同的,glClearColor()似乎被忽略了。

有什么想法我可以进一步追查这个问题吗?

嗯,我仍然不确定为什么它之前在我的机器上运行,但问题是:

pfd.dwFlags   = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;

后改为:

pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

它确实在任何地方运行。我没有在PIXELFORMATDESCRIPTOR中指定双缓冲,这似乎带来了奇怪的问题(由于某种原因在我的机器上工作-但在其他机器上没有)。

相关文章:
  • 没有找到相关文章