C++ 某些机器上的OpenGL黑屏(像素格式描述符/SwapBuffer?)
我已经编写了一个OpenGL应用程序,它将在一些机器上崩溃(在我自己的测试机器上运行:Windows 8、Windows 7、Windows Vista(x86)-但在一些使用Windows Vista(x86)的客户端机器上崩溃)-我还不知道确切的原因,但我将应用程序降级为一个空框架,它只会执行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
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;