我正在主窗口中使用 OpenGL 制作 Win32 应用程序(不使用 GLUT)。
我现在在 WM_PAINT 中有我的绘图代码,当我调用 swapBuffers 时,它必须使自身无效,因为它不断地重新渲染并使用大量 cpu 资源。我怎样才能让它只在像使用 GDI 时那样诚实地接收 WM_PAINT 时才呈现?

谢谢

最佳答案

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 上下文的副作用是,从 BeginPaint 检索到的 hdc 用作渲染(和 SwapBuffer)目标,这意味着 OpenGL 应用程序现在将在其他窗口拖动到应用程序窗口上时同步绘制。

关于c++ - SwapBuffers 导致重绘,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2842319/

10-11 00:38