我正在主窗口中使用 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/