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

Posted

技术标签:

【中文标题】某些机器上的 OpenGL 中的黑屏(PIXELFORMATDESCRIPTOR/SwapBuffer?)【英文标题】:Black screen in OpenGL on some machines (PIXELFORMATDESCRIPTOR/SwapBuffer?) 【发布时间】:2014-06-15 10:00:44 【问题描述】:

我编写了一个 OpenGL 应用程序,它会在某些机器上崩溃(在我自己运行的测试机器上:Windows 8、Windows 7、Windows Vista (x86) - 但在某些装有 Windows Vista (x86) 的客户端机器上它会崩溃) - 我还不知道究竟是为什么,但我将应用程序降级为一个空框架,它只会执行glClear()。然后应用程序运行至少没有崩溃(可以创建 OpenGL 上下文,可以加载 glew),但是屏幕没有以指定的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: %s\n", glewGetErrorString(err));

fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));

此代码输出:“状态:使用 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() 似乎被忽略了。

关于如何进一步解决这个问题的任何想法?

【问题讨论】:

【参考方案1】:

好吧,我仍然不确定为什么它之前确实在我的机器上运行过,但问题在于:

pfd.dwFlags   = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;

改成之后:

pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

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

【讨论】:

你不确定你做了什么是什么意思? :) 您请求了具有双缓冲的像素格式,而不是依赖驱动程序简单地交给您的机会。当您实际需要双缓冲(在现代版本的 Windows 上总是由于合成窗口管理器)时,您应该始终请求双缓冲。 我的意思是我不确定为什么它在不请求双缓冲的情况下工作 - 但这是有道理的:感谢澄清!

以上是关于某些机器上的 OpenGL 中的黑屏(PIXELFORMATDESCRIPTOR/SwapBuffer?)的主要内容,如果未能解决你的问题,请参考以下文章

iPad上的黑屏而不是启动图像

设备上的黑屏;模拟器工作正常

iPad 视网膜显示屏上的黑屏

OpenGL 与 GLUT - 黑屏

webrtc with firebase:如何修复 ios/safari 上的黑屏

用于 android html5 视频的 chrome 上的黑屏