一部のマシンでクラッシュする OpenGL アプリケーションを作成しました (自分のテスト マシンでは実行されます: Windows 8、Windows 7、Windows Vista (x86) - しかし、Windows Vista (x86) の一部のクライアント マシンではクラッシュします) - 私は正確な理由はまだわかりませんが、アプリケーションを空のスケルトンにダウングレードしましたglClear()
。その後、アプリケーションは少なくともクラッシュすることなく実行されます (OpenGL コンテキストが作成され、glew が読み込まれる可能性があります) が、画面は指定されたglClearColor
色でクリアされません。私は、PIXELFORMATDESCRIPTOR
またはSwapBuffer
そこで期待どおりに機能しない問題があると思われます。
私のコード(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));
このコードは次を出力します: "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()
無視されているようです。
この問題をさらに追い詰める方法についてのアイデアはありますか?