我可以在创建X11窗口后使其支持OpenGL吗?
我想能够渲染到一个X窗口,只要它的id 在本例中,我使用gtk在python中创建了一个窗口 我可以获取一个我可以在创建X11窗口后使其支持OpenGL吗?,opengl,x11,Opengl,X11,我想能够渲染到一个X窗口,只要它的id 在本例中,我使用gtk在python中创建了一个窗口 我可以获取一个gtk.Drawable的窗口ID,并将其传递到我的C python模块中,但是我可以对它进行OpenGL调用吗 我知道gtkglext,但如果可能的话,我宁愿不使用它 更新1: 好的,所以(现在我看到的很明显)您只需使用从gtk.Window.xid获得的窗口id的父级,使用opengl窗口的正确标志,然后执行XCreateWindow 唯一的问题是,如果窗口中没有多个小部件,我就无法让
gtk.Drawable
的窗口ID,并将其传递到我的C python模块中,但是我可以对它进行OpenGL调用吗
我知道gtkglext,但如果可能的话,我宁愿不使用它
更新1:
好的,所以(现在我看到的很明显)您只需使用从gtk.Window.xid
获得的窗口id的父级,使用opengl窗口的正确标志,然后执行XCreateWindow
唯一的问题是,如果窗口中没有多个小部件,我就无法让它工作,否则,xid似乎代表了一个覆盖整个顶级窗口的窗口。不知道该如何纠正
更新2:
事实证明,如果您有一个与顶级窗口大小相同的gl窗口,那么顶级窗口将不会获得公开事件,直到gl窗口的缓冲区被交换。你只要不断地交换缓冲区,一切都会好起来的
更新3:
要回答@babele的评论:
在python中,gtk文档说明了如何从现有的xid创建gtk窗口。在此之后,您只需记住继续调用该窗口(如果它是opengl缓冲窗口,否则当您使用window\u foreign\u new时,它应该可以工作)
所以这个过程是这样的:
还请注意,您必须通过连接gtk resize事件来手动管理W2的大小调整。您可以通过连接到,然后调用处理程序并将结果传递给c/c++模块来实现这一点,在那里您可以适当地调整W2的大小。这是一个好主意。您不需要创建新窗口,而是将现有窗口传递给glXMakeCurrent()。
在当前设置中,您需要:
然而,这是向后的,迫使OpenGL使用CreateWindow所使用的可视化。这通常是有效的,因为默认的visual具有sane GLX属性,但正确的应用程序将使用所需的GLX属性创建glXChooseVisual,然后使用该visual创建窗口。“我找到了一种方法让gtk管理使用XCreateWindow手动创建的窗口”。。。请你再解释一下怎么做好吗?我正在搜索类似的代码片段,但找不到任何东西。。只是一个粗略的概述:)谢谢!那么XSetWindowAttributes如何将窗口的可视性更改为合适的OpenGL呢?这行吗?XChangeWindowAttributes无法更改窗口的视觉效果。您需要创建所需视觉效果的窗口。