【问题标题】:Xlib's `Window` vs. GLX's `GLXWindow` confusionXlib 的 `Window` 与 GLX 的 `GLXWindow` 混淆
【发布时间】:2020-03-22 03:20:48
【问题描述】:

我正在查看使用 GLX 创建 OpenGL 上下文的各种示例代码,但我对这两种类型的窗口对象感到困惑:Window used XlibGLX 使用的GLXWindow,因为在某些示例代码中,它们直接使用 Xlib 的窗口进行渲染,而在其他代码中,它们另外创建 GLX 的窗口。
我的问题是:

  1. 这两者有什么区别?
  2. 我需要两者都创建,还是只需要 Window 就可以?

GLX 1.4 文档(还有最新的吗?)告诉我使用glXCreateWindow 创建GLXWindow,而这个以Window 作为其第三个参数。我不确定这是否应该是GLXWindow 的父窗口,或者Window 是否被GLXWindow“包装”,文档似乎对此不清楚。有谁知道这应该如何工作及其背后的理由?以及为什么有些示例使用GLXWindows,而有些不使用,但它们似乎仍然可以正常工作?

让我感到困惑的另一件事是,一些示例使用glXCreateContext 创建其 OpenGL 上下文,而其他示例(包括 GLX 1.4 规范)使用glXCreateNewContext。两者似乎都在我的库版本中可用,但我不太明白它们之间有什么区别。

还有glXMakeCurrentglXMakeContextCurrent – 另一个让我感到困惑的来源。

谁能解释一下这些拼写略有不同的函数/类型之间的区别,或者将我发送到一些我可以自己了解的在线资源?

哦,还有一件事:这些东西仍然适用于现代 OpenGL(3.0+,可编程管道之一)吗?或者只是一些我不应该抨击我可怜的小马头的旧垃圾? :q

【问题讨论】:

    标签: opengl window xlib glx


    【解决方案1】:

    由于我从未听说过 GLXWindow,我开始好奇它是什么。大多数讨论,do not clarify 为什么这个是必要的,并且只传播猜测,包括我的回答。

    首先要澄清的是,GLXWindow 已在 GLX 1.3 中引入。旧版本,包括 GLX 1.2 定义了以下 GLXDrawable 列表:{Window, GLXPixmap},带有 GLXPixmap从屏幕外 X Pixmap 创建。 Specs 并没有说明为什么在 X Pixmap 之上需要 GLXPixmap,而 X Window 可以直接使用,但猜测是 X Pixmap 定义中缺少某些东西,GLX 需要将其存储在 GLXPixmap 中...

    GLX 1.3GLXDrawable 的定义扩展为 { GLXWindow, GLXPixmap, GLXPbuffer强>,窗口 }。这样您就可以看到一个新项目 GLXPbuffer,这是在 OpenGL 本身引入帧缓冲区对象 (FBO) 之前尝试改进离屏渲染。与像素图和窗口不同,GLXPbuffer 是从零开始创建的,在 X 中没有任何关系。还有一个新的 GLXWindow 带有注释:

    为了向后兼容 GLX 1.2 及更早版本, 渲染上下文也可用于渲染到窗口中。

    所以 GLXWindow 看起来更像是试图统一所有 GLXDrawable 的 API(和内部逻辑),而不是修复某些问题的工具,因为它没有乍一看就扩展了 X Window 的功能。

    GLXWindow 是否引入了新的东西?事实上,确实如此! GLX 1.3 还引入了一个新函数 glXSelectEvent(),它允许在 X11 流中处理特定于 GLX 的事件。因此该函数适用于 GLXWindow 和 GLXPbuffer,但不适用于 X Window(因为它是专门为区分 GLX 事件和正常事件而创建的)。令人困惑的是,由规范定义的唯一特定于 GLX 的事件是 GLXPbufferClobberEvent 类型,这似乎与过时的 PBuffers 和 Window 辅助缓冲区(现在在核心 OpenGL 规范中被 FBO 取代)更相关。

    因此,我个人认为没有任何实际理由创建 GLXWindow 而不是使用 X Window 本身,而不仅仅是遵循 GLX 规范建议(说明使用 X Window 只是为了与针对旧 GLX 版本编写的应用程序兼容)并使用“清理”的 API。

    关于glXCreateNewContext() vs glXCreateContext(),这与引入GLXFBConfig有关,作为X Visual 定义不足以代表所有必要的细节。来自规格:

    调用 glXCreateContext(dpy, visual, share list, direct) 是 相当于调用 glXCreateNewContext(dpy, config, render type, 共享列表,直接),其中 config 是由 视觉对象的 GLX_FBCONFIG_ID 属性。

    关于 glXMakeCurrent()glXMakeContextCurrent(),较新的 GLX 版本引入的后者允许以类似于现代 FBO 允许的方式使用不同的可绘制和可读缓冲区,这从规格中也很清楚:

    调用 glXMakeCurrent(dpy, draw, ctx) 相当于调用 glXMakeContextCurrent(dpy,绘制,绘制,ctx)。请注意,抽奖将是 用于 draw 和 read drawable。

    关于现代 OpenGL 3+ 的使用,GLX 在这里没有问题 - 只需使用像 GLX_ARB_create_context_profile 这样的 GLX 扩展来创建上下文(当前的 Mesa 库实现在创建 Core Profile 时提供了更高的 OpenGL 版本,但在专有驱动程序的情况下通常没有这种不同)。

    当然,如果您热衷于新的显示服务器,您可以考虑改用 EGL(但它会限制 OpenGL 上下文功能,因为与 GLX 相比缺少一些选项)或 Wayland/Mir 的东西并希望从依赖项中摆脱 X(Wayland 实现了 Xlib 兼容层,因此它现在不是一个显示停止器)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多