0

我有一个将 OpenGL 与 Motif 混合的应用程序。包含 OpenGL 的大主窗口可以重新绘制。但是,坐在它上面的子窗口都变黑了。具体来说,只是那些位于主窗口顶部的子窗口的一部分。这些子窗口中都只有 Motif 代码(除了一个)。

该应用程序不会冻结或转储核心。数据仍在流动,随着文本字段等各种子窗口的更新,这些部分会重新绘制。相互拖动窗口或最小化/取消最小化也会触发重绘。“停电”的时间是随机的。我每次都运行相同的 1 小时数据集,有时停电发生在运行 5 分钟,有时是 30 分钟,等等。

我经历了关闭部分代码的过程,直到问题停止。越来越窄,发现它与使用深度缓冲区有关。换句话说,当我注释掉 时glEnable(GL_ENABLE_DEPTH_TEST),问题就消失了。所以这个问题似乎与深度缓冲区的使用有关。

据我所知,深度缓冲区在重绘完成之前就被清除了,这是应该的。调用周围有 if 语句glClear,所以我把消息放在那里,并确认glClear即使发生中断,深度缓冲区也确实发生了。而且,glGetError什么都没回。

更新 6/30/2014 看起来至少还有一个人在看这个(感谢 UltraJoe)。如果我没记错的话,事实证明它有时会在没有先定义后台缓冲区并向其绘制任何内容的情况下交换缓冲区。以前对我来说并不明显,因为这是一个很长的例程。还有一些其他的小东西我必须清理,但我认为这是主要原因。

4

2 回答 2

1

这是一个老问题,我知道,但答案可能对其他人有所帮助。

这听起来像是您为 OpenGL 窗口选择了一个糟糕的视觉效果,或者您正在创建一个覆盖默认值的新颜色图。如果可能,请为应用程序中的所有内容选择 DirectColor 24 平面视觉效果。DirectColor 视觉效果使用只读颜色单元,但 24 个平面将允许每个窗口都可以使用每种支持的颜色,而无需覆盖颜色单元。

于 2014-06-09T18:20:18.850 回答
1

How did you create the OpenGL window/context. Did you just get the X11 Window handle of your Motif main window and created the OpenGL context on that one? Or did you create a own subwindow within that Motif window for OpenGL?

You should not use any window managed by a toolkit directly, unless this was some widget for exclusive OpenGL use. The reason is, that most toolkits don't create a own sub-window for each an every element and also reuse parts of their graphics resources.

Thus you should create a own sub-window for OpenGL, and maybe a further subwindow using glXCreateWindow as well.

于 2012-11-01T07:08:21.630 回答