SwapBuffers вызывает перерисовку - PullRequest
2 голосов
/ 16 мая 2010

Я делаю Win32-приложение с OpenGL в главном окне (без использования GLUT). У меня есть мой код рисования в WM_PAINT прямо сейчас, когда я вызываю swapBuffers, он должен аннулировать себя, потому что он постоянно перерисовывается и использует много ресурсов процессора. Как сделать так, чтобы он отображался только тогда, когда он честно получает WM_PAINT, как при использовании GDI?

Спасибо

Ответы [ 2 ]

5 голосов
/ 16 мая 2010

Сообщения WM_PAINT продолжают отправляться до тех пор, пока Windows не проверит грязную область окна. API, который сбрасывает грязную область, называется «EndPaint».

Вызов SwapBuffers не должен влиять на недопустимую область окна.

Ваш обработчик WM_PAINT должен выглядеть примерно так:

case WM_PAINT:
  HDC hdc;
  PAINTSTRUCT ps;
  hdc = BeginPaint(hwnd,&ps);
  wglMakeCurrent(hdc,scene.m_oglContext);
  scene.Render(); //
  wglSwapBuffers(hdc);
  wglMakeCurrent(hdc,0);
  EndPaint(hwnd,&ps);
  return 0;

Множество примеров кода для программирования Open GL имеют одну настройку контекста HDC и OpenGL при запуске приложения. Хотя это упрощает пример кода, это означает, что код не может корректно работать с несколькими контекстами OpenGL. Этот обработчик WM_PAINT предполагает, что контекст OpenGL создается для сцены, а затем обновляется по мере необходимости.

Побочным эффектом замены контекста OpenGL по мере необходимости является то, что hdc, полученный из BeginPaint, используется в качестве цели рендеринга (и SwapBuffer), что означает, что приложение OpenGL теперь будет рисовать синхронно, если и когда другие окна перетаскиваются поверх Окно приложения.

1 голос
/ 16 мая 2010

Я подозреваю, что вы не возвращаете 0 из вашего обработчика WM_PAINT. Это означает, что WM_PAINT просто продолжают генерироваться. Если вы вернете 0, то, я думаю, проблема исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...