【问题标题】:Can I make an X11 window OpenGL capable after it has been created?我可以在创建 X11 窗口后使其支持 OpenGL 吗?
【发布时间】:2011-01-23 23:22:09
【问题描述】:

我希望能够在仅给出其 id 的 X 窗口中呈现。

在这种情况下,我有一个由 gtk 在 python 中创建的窗口。

我可以获取gtk.Drawable 的窗口 ID 并将其传递给我的 C python 模块,但是我可以让 OpenGL 调用渲染到它吗?

我知道 gtkglext,但如果可能,我宁愿不使用它。

更新 1:

好的,所以(很明显,现在我看到了)您只需使用您从gtk.window.xid 获得的 Window id 的父级执行XCreateWindow,使用正确的标志用于 opengl 窗口,嘿presto。

唯一的问题是,如果窗口中没有多个小部件,我无法让它工作,否则看起来 xid 代表一个覆盖整个顶层窗口的窗口。不知道如何纠正这个问题。

更新 2: 事实证明,如果你有一个与顶层大小相同的 gl 窗口,那么顶层窗口将不会得到暴露事件,直到 gl 窗口的缓冲区被交换。您只需要不断交换缓冲区,一切都会好起来的。

更新 3:

回答@babele 的评论:

This page 在 python gtk 文档中说明了如何从现有 xid 制作 gtk 窗口。之后你只需要记住为那个窗口继续调用glXSwapBuffers(如果它是一个opengl缓冲窗口,否则它应该在你使用window_foreign_new时才可以工作)。

流程如下:

  1. 创建一个包含您的 OpenGL 窗口的 gtk 小部件(DrawingArea 是一个不错的选择 - 您不能使用例如标签,因为它没有自己的 xid)
  2. 获取小部件的 gtk.gdk.Window (docs)
  3. 从 gtk.gdk.Window 获取 xid(将此窗口称为 W1)
  4. 将其传递给您的 C/C++ 代码
  5. 将支持 opengl 的窗口 (W2) 创建为 W1 的子级
  6. 将 W2 的 xid 传回 python
  7. 使用 window_foreign_new 和 W2 的 xid 创建新的 gtk.gdk.window 对象
  8. 您每次在 W2 gtk 上调用 glXSwapBuffers 时都应该能够对公开事件做出反应。

真正让我震惊的一点是,如果 W2 覆盖整个 W1,那么 W1 在 W2 的缓冲区被交换之前不会接收事件。如果 W1 是一个顶级窗口,这尤其令人困惑,因为它可能根本没有出现在您的屏幕上(窗口就在那里,但它看起来就像它后面的任何东西,直到它被绘制到,直到它才会发生获取一个暴露事件)。

另外请注意,您必须通过连接到 gtk resize 事件来手动管理 W2 的大小调整。您可以通过连接到this signal,然后在处理程序中调用this function 并将结果传递给您的c/c++ 模块来实现此目的,您可以在其中适当地调整W2 的大小。 request a minimum size 是个好主意。

【问题讨论】:

  • "我找到了一种方法让 gtk 管理使用 XCreateWindow 手动创建的窗口" ...请您解释一下如何做到这一点?我正在寻找一些类似的 sn-p 但我找不到任何东西.. 只是一个粗略的概述 :) THX!

标签: opengl x11


【解决方案1】:

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

  1. XGetWindowAttributes() 检索创建窗口时使用的视觉对象
  2. glXCreateContext() 使用此视觉对象
  3. glXMakeCurrent() 使用此上下文和窗口 id

但是,这样做是倒退的,迫使 OpenGL 使用用于 CreateWindow 的视觉对象。这通常会起作用,因为默认视觉对象具有合理的 GLX 属性,但正确的应用程序将 glXChooseVisual 与所需的 GLX 属性,然后使用该视觉对象创建窗口。

【讨论】:

  • XSetWindowAttributes 如何将窗口的 Visual 更改为正确的 OpenGL 呢?这行得通吗?
  • XChangeWindowAttributes 无法更改窗口的视觉效果。您需要创建所需的可视化窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多