我可以在创建X11窗口后使其支持OpenGL吗?

我可以在创建X11窗口后使其支持OpenGL吗?,opengl,x11,Opengl,X11,我想能够渲染到一个X窗口,只要它的id 在本例中,我使用gtk在python中创建了一个窗口 我可以获取一个gtk.Drawable的窗口ID,并将其传递到我的C python模块中,但是我可以对它进行OpenGL调用吗 我知道gtkglext,但如果可能的话,我宁愿不使用它 更新1: 好的,所以(现在我看到的很明显)您只需使用从gtk.Window.xid获得的窗口id的父级,使用opengl窗口的正确标志,然后执行XCreateWindow 唯一的问题是,如果窗口中没有多个小部件,我就无法让

我想能够渲染到一个X窗口,只要它的id

在本例中,我使用gtk在python中创建了一个窗口

我可以获取一个
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时,它应该可以工作)

所以这个过程是这样的:

  • 创建一个包含OpenGL窗口的gtk小部件(a是一个不错的选择-您不能使用标签,因为它没有自己的xid)
  • 获取小部件的gtk.gdk.Window()
  • 从gtk.gdk.Window获取xid(将此窗口称为W1)
  • 将其传递给您的C/C++代码
  • 将支持opengl的窗口(W2)创建为W1的子窗口
  • 将W2的xid传递回python
  • 使用window_foreign_new和W2的xid创建新的gtk.gdk.window对象
  • 每次在W2 gtk上调用glXSwapBuffers时,都应该能够对公开事件做出反应
  • 真正让我吃惊的是,如果W2覆盖了整个W1,那么W1将不会接收事件,直到W2的缓冲区被交换。如果W1是一个顶级窗口,这尤其令人困惑,因为它可能根本没有在屏幕上显示任何内容(窗口在那里,但它看起来像它后面的任何东西,直到它被绘制到,这将不会发生,直到它获得曝光事件)


    还请注意,您必须通过连接gtk resize事件来手动管理W2的大小调整。您可以通过连接到,然后调用处理程序并将结果传递给c/c++模块来实现这一点,在那里您可以适当地调整W2的大小。这是一个好主意。

    您不需要创建新窗口,而是将现有窗口传递给glXMakeCurrent()。
    在当前设置中,您需要:

  • XGetWindowAttributes()来检索创建窗口时使用的可视窗口
  • glXCreateContext()使用此可视化
  • glXMakeCurrent()使用此上下文和窗口id

  • 然而,这是向后的,迫使OpenGL使用CreateWindow所使用的可视化。这通常是有效的,因为默认的visual具有sane GLX属性,但正确的应用程序将使用所需的GLX属性创建glXChooseVisual,然后使用该visual创建窗口。

    “我找到了一种方法让gtk管理使用XCreateWindow手动创建的窗口”。。。请你再解释一下怎么做好吗?我正在搜索类似的代码片段,但找不到任何东西。。只是一个粗略的概述:)谢谢!那么XSetWindowAttributes如何将窗口的可视性更改为合适的OpenGL呢?这行吗?XChangeWindowAttributes无法更改窗口的视觉效果。您需要创建所需视觉效果的窗口。