可以在2个窗口中使用openGL吗?如在2个不同的窗口(假设第一个是640x480,另一个是1024x768)渲染不同的东西(假设一个窗口是编辑器,另一个是主/正常窗口显示)
如果您正在使用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允许您在不同的上下文之间共享某些数据,但是根据规范,您可以共享的数据非常有限.但是,大多数操作系统允许您共享比规范中指定的数据更多的数据.
是的,这是可能的.对于每个窗口,您将需要创建唯一的设备上下文和渲染上下文.
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);