2013-05-06 180 views
1

是否可以隐藏OpenGL窗口并且渲染仍在运行?我使用glutHideWindow,它永远不会触发显示功能。隐藏GLUT窗口

如果这是不可能的,是否有可能在程序中改变当前窗口的焦点?我想运行opengl程序,但我不需要那个窗口。实际上,我想在另一个程序的每一帧中使用opengl更新的framebuffer。但是在两个程序之间切换总是很烦人。 (它们都有窗口)

+0

那么如何实现? – 2013-05-06 17:33:59

+0

@BЈовић:它与显示回调没有任何关系。没有任何OP要求以天真的方式不可能。 – datenwolf 2013-05-06 17:44:55

+0

@datenwolf好吧,它取决于窗口系统。我的经验是,如果你发出窗口渲染,它可能会被重新渲染 - 无论窗口是否被覆盖。 – 2013-05-06 18:05:27

回答

5

是否可以隐藏OpenGL窗口并且渲染仍在运行?

是和否对问题的两个部分。

如果隐藏窗口,则在渲染时,窗口视口的所有像素都将失败像素所有权测试。所以你不能使用一个隐藏的窗口作为OpenGL的可绘图操作。

你需要的是一个屏幕上的drawable来绘制。

现代变体是帧缓冲对象(FBO),您可以在常规OpenGL上下文中创建这些功能,甚至可以在隐藏窗口上工作。 FBO使用一些可绘制的附件(渲染缓冲区,纹理),并允许OpenGL将其绘制到窗口中。

较旧的方法是PBuffers,也得到广泛支持,但不像FBO那样容易使用。

请注意,如果您要在Linux/X11上执行离屏渲染,X服务器必须处于活动状态,即拥有VT,以便GPU实际处理命令。所以你不能只是在后台启动X服务器,而是让另一个X服务器使用显示设备。

+0

@BЈовић:两条评论与你不好的建议。请停止提出反作用的建议。 OP需要一个FBO或一个PBuffer。根本不需要共享内存(共享内存是一种内部进程技术,但这不是OP所要求的)。 – datenwolf 2013-05-06 19:20:52

+0

像素所有权测试失败是最好的情况。我还可以想象,使上下文当前失败,并且当窗口重新获得可见性时,所有OpenGL资源可能不得不重新加载到新的上下文中。 – 2013-05-06 20:20:45

+0

@ BenVoigt:这种情况是不允许发生的。 GLX和Win32 GDI都允许将上下文绑定为不可见(隐藏/未映射/不活动)可绘制。 drawable上的绘制操作是未定义的,但所有不在drawable上的OpenGL操作都可以使用。对于PBuffers GLX指定了一个“损坏”的条件,这与常规窗口的损坏状态非常相似,即由于内容未定义,需要完全重新绘制。另外,因为单个OpenGL上下文没有绑定到单个可绘制的对象上,所以drawable不会损害上下文本身。 – datenwolf 2013-05-06 21:03:23

0

创建窗口后,您可以使用glutHideWindow()离开屏幕。然后,您仍然渲染为正常,并使用glReadPixels回读并获取缓冲区以便稍后使用它。

+0

谢谢@Ast Derek。我的英语不好:)下次我会更加小心 – diennv 2017-08-18 06:39:59