当前位置:  开发笔记 > 开发工具 > 正文

OpenGL中有多个窗口?

如何解决《OpenGL中有多个窗口?》经验,为你挑选了2个好方法。

可以在2个窗口中使用openGL吗?如在2个不同的窗口(假设第一个是640x480,另一个是1024x768)渲染不同的东西(假设一个窗口是编辑器,另一个是主/正常窗口显示)



1> Jasper Bekke..:

如果您正在使用GLUT,您可以使用glutSetWindow()/ glutGetWindow()调用来选择正确的窗口(在使用glutCreateSubWindow()创建它们之后).但有时GLUT可能不适合这项工作.

如果您正在使用Windows,则需要查看wglMakeCurrent()和wglCreateContext().在OS X上有aglSetCurrentContext()等等,X11需要glXMakeCurrent().

这些函数激活您可以渲染的当前OpenGL上下文.每个特定于平台的库都有自己创建窗口和将OpenGL上下文绑定到它的方法.

在Windows上,在为窗口获取HWND和HDC之后(在CreateWindow和GetDC调用之后).你通常做这样的事情来设置OpenGL:

GLuint l_PixelFormat = 0;

// some pixel format descriptor that I generally use:
static PIXELFORMATDESCRIPTOR l_Pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, 
    PFD_DRAW_TO_WINDOW + PFD_SUPPORT_OPENGL + PFD_DOUBLEBUFFER, 
    PFD_TYPE_RGBA, m_BitsPerPixel, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0};

if(!(l_PixelFormat = ChoosePixelFormat(m_hDC, &l_Pfd))){
    throw std::runtime_error("No matching pixel format descriptor");
}

if(!SetPixelFormat(m_hDC, l_PixelFormat, &l_Pfd)){
    throw std::runtime_error("Can't set the pixel format");
}

if(!(m_hRC = wglCreateContext(m_hDC))){
    throw std::runtime_error("Can't create rendering context");
}

wglMakeCurrent(m_hDC, m_hRC);

您使用该代码创建多个窗口并将OpenGL绑定到它,然后每次要绘制到特定窗口时,您必须执行任何操作之前调用wglMakeCurrent 并传入与该窗口对应的参数.

作为旁注,OpenGL允许您在不同的上下文之间共享某些数据,但是根据规范,您可以共享的数据非常有限.但是,大多数操作系统允许您共享比规范中指定的数据更多的数据.



2> postfuturist..:

是的,这是可能的.对于每个窗口,您将需要创建唯一的设备上下文和渲染上下文.

HDC hDC = GetDC( hWnd ); /* get the device context for a particular window */
/* snip */
HGLRC hRC;
hRC = wglCreateContext( hDC ); /* get a render context for the same window */
/* repeat with hDC2 and hRC2 with another window handle*/

在对窗口进行GL调用之前,必须调用wglMakeCurrent,如下所示:

wglMakeCurrent( hDC, hRC );
/* GL calls for first window */
wglMakeCurrent( NULL, NULL);

wglMakeCurrent( hDC2, hRC2 );
/* GL calls for second window */
wglMakeCurrent( NULL, NULL);

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有