Черный экран в OpenGL на некоторых машинах (PIXELFORMATDESCRIPTOR/SwapBuffer?)

Я написал приложение 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);
  }
} 

На моей собственной машине я получаю серый экран (как и ожидалось), но на машинах, где произошла ошибка моей исходной программы, экран просто черный (но ни один из MessageBoxes не появляется, и вывод также: "Статус: Использование 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 и это, казалось, принесло странные проблемы с этим (работал на моей машине по некоторым причинам - но не на других).

Другие вопросы по тегам