gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:14:57 27 4
gpt4 key购买 nike

我希望能够在仅给出其 ID 的情况下渲染到 X Window。

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

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

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

更新 1:

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

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

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

更新 3:

要回答@babele 的评论:

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

于是流程如下:

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

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

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

    最佳答案

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

  • XGetWindowAttributes() 检索创建窗口的视觉对象
  • glXCreateContext() 使用这个视觉
  • glXMakeCurrent() 使用此上下文和窗口 ID

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

    关于opengl - 我可以在创建 X11 窗口后使其支持 OpenGL 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248127/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com