C++ 某些机器上的OpenGL黑屏(像素格式描述符/SwapBuffer?)

C++ 某些机器上的OpenGL黑屏(像素格式描述符/SwapBuffer?),c++,windows,opengl,pixelformat,C++,Windows,Opengl,Pixelformat,我已经编写了一个OpenGL应用程序,它将在一些机器上崩溃(在我自己的测试机器上运行:Windows 8、Windows 7、Windows Vista(x86)-但在一些使用Windows Vista(x86)的客户端机器上崩溃)-我还不知道确切的原因,但我将应用程序降级为一个空框架,它只会执行glClear()。然后,应用程序运行时至少不会发生崩溃(可以创建OpenGL上下文,可以加载glew),但在指定的glClearColor颜色中屏幕不会被清除。我怀疑我的PIXELFORMATDESC

我已经编写了一个OpenGL应用程序,它将在一些机器上崩溃(在我自己的测试机器上运行:Windows 8、Windows 7、Windows Vista(x86)-但在一些使用Windows Vista(x86)的客户端机器上崩溃)-我还不知道确切的原因,但我将应用程序降级为一个空框架,它只会执行
glClear()
。然后,应用程序运行时至少不会发生崩溃(可以创建OpenGL上下文,可以加载glew),但在指定的
glClearColor
颜色中屏幕不会被清除。我怀疑我的
PIXELFORMATDESCRIPTOR
SwapBuffer
中出现了一些问题,但这些问题并没有像预期的那样起作用

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

此代码输出:“状态:使用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);
  }
} 
while(true){
timeDuration=std::chrono::duration\u cast(std::chrono::high\u resolution\u clock::now()-lastTime);
lastTime=std::chrono::高分辨率时钟::现在();
time+=timeDuration.count();
glClearColor(0.7f、0.7f、0.7f、1.0f);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
SwapBuffers(hdc);
while(peek消息(&msg,NULL,0,0,PM_-REMOVE)){
翻译信息(&msg);
发送消息(&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
中指定双缓冲,这似乎带来了奇怪的问题(出于某种原因在我的机器上工作,但在其他机器上不工作)。

什么意思你不确定你做了什么?:)您要求使用双缓冲的像素格式,而不是依赖于驱动程序简单地交给您一个。当您实际需要双缓冲时,您应该始终请求双缓冲(在现代版本的Windows上,这总是由于合成窗口管理器)。我的意思是,我不确定为什么不请求双缓冲就可以工作-但这很有意义:感谢您的澄清!
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;