由于我从未听说过 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.3 将 GLXDrawable 的定义扩展为 { 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 兼容层,因此它现在不是一个显示停止器)。