我想在窗口内创建一个带有 GLX 的 OpenGL 上下文。但是,我不希望它跨越整个窗口区域。相反,它应该只覆盖一个子区域。
例如,GLUT 为这种行为提供了一个函数。像 GTK+ 或 QT 这样的主要工具包也提供了 GL 小部件,它们只是 X 窗口的子区域。但是我需要在底层工作。
glXMakeCurrent() 接受一个 X Drawable 标识符。是否可以将 Drawable 定义为窗口的子区域?还是有其他方法可以将上下文绑定到窗口区域?
编辑:添加了令人敬畏的赏金!
我想在窗口内创建一个带有 GLX 的 OpenGL 上下文。但是,我不希望它跨越整个窗口区域。相反,它应该只覆盖一个子区域。
例如,GLUT 为这种行为提供了一个函数。像 GTK+ 或 QT 这样的主要工具包也提供了 GL 小部件,它们只是 X 窗口的子区域。但是我需要在底层工作。
glXMakeCurrent() 接受一个 X Drawable 标识符。是否可以将 Drawable 定义为窗口的子区域?还是有其他方法可以将上下文绑定到窗口区域?
编辑:添加了令人敬畏的赏金!
您只能 glXMakeCurrent() 一个 X Drawable,而不是它的一个子部分,但是您的解决方案很简单:停止将 X 窗口视为您的应用程序。每个 X 应用程序通常由 10 或 100 个 X 窗口组成。在您想要的区域中创建一个子窗口并在其中绘制。
或者,您可以创建一个像素图,在其中渲染,然后复制到窗口的某个区域,但这会更慢。
我在BSD 手册页中发现了这条有用的信息:
在几乎所有对您很重要的方面,子窗口都类似于顶级窗口。它有一个窗口 ID;它有自己的一组事件回调;你可以渲染它;您会收到创建它的通知;...
子窗口位于其他窗口(可能是顶级窗口,也可能是另一个子窗口)内。因此,它通常只与您自己创建的其他窗口交互,因此它不受窗口管理器的约束。这是与顶级窗口不同的主要来源:
所以我假设流行工具包中的 GL 小部件实际上也充当了一个独特的(子)窗口。有趣的是,这对窗口管理器是透明的,因此对用户也是透明的。