你能否在不打开窗口的情况下创建OpenGL上下文?

32

有时候我需要获取OpenGL帧缓冲对象,但我并不想打开任何类型的窗口。

是否可以创建一个OpenGL上下文而不将它附加到任何类型的窗口?

3个回答

14

是的!你可以使用桌面窗口作为OpenGL传递的窗口,只要你不试图在其上显示任何内容 ;)

只需调用GetDesktopWindow并将结果作为参数传递给创建新的OpenGL窗口。


这对于xorg也有效吗? 当我尝试时,它似乎能够成功打开上下文,但我没有尝试打开一个帧缓冲对象并进行渲染。 - Cheery
我知道它也可以在DirectX上工作,但我从未尝试过在xorg中使用这个技巧。 - Dror Helper
我尝试使用GetDesktopWindow(),但它对我无效。改用GetDC(NULL)代替GetDC(GetDesktopWindow())可正常工作。 - 0xAA55

6
根据此网页,可以使用WGL_ARB_create_context创建一个没有窗口的上下文。 我自己还没有实际尝试过。我使用freeGLUT创建上下文,然后在帧缓冲器+渲染缓冲器中进行离屏渲染。我退出程序而没有调用glutMainLoop。虽然有点笨拙,但对我的目的来说它起作用了。

http://www.opengl.org/wiki/Creating_an_OpenGL_Context


2
为了检索此扩展,您需要使用旧的“WGL”扩展创建OpenGL上下文,这需要一个窗口。 - user1596212

2

是的,您可以使用OpenGL进行离屏渲染,但确切的设置方式取决于操作系统。 最接近独立于操作系统的方法是使用Mesa 3D,但这样您的离屏渲染将不会获得硬件加速。


最后一条评论还有效吗?如果我理解正确,在Linux上,Mesa的速度接近专有驱动程序。 - Adrian Maire
有点像。在Linux上,Mesa允许软件和硬件渲染,但是根据渲染器和驱动程序以及发送的GL命令,两者之间的结果可能会有微妙的差异。 Mesa软件渲染器倾向于在不同的操作系统上获得类似的结果,但可能不一定易于在每个操作系统上设置,并且像Ronny所说,仅限软件的Mesa没有与图形卡GPU进行硬件加速。(尽管现代纯软件Mesa代码在现代主处理器CPU上具有大量加速)http://www.mesa3d.org/faq.html - don bright

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接