我有一个混合了OpenGL和Motif的应用程序。其中有OpenGL的大主窗口重绘得很好。但是,坐在它上面的子窗口都变黑了。具体来说,只是那些位于主窗口顶部的子窗口的部分。这些子窗口中只有Motif代码(除了一个)。
该应用程序不会冻结或转储核心。数据仍在流动,随着文本字段等各种子窗口的更新,这些部分会重新绘制。相互拖动窗口或最小化/取消最小化也会触发重绘。 “停电”的时间是随机的。我每次运行相同的1小时数据集,有时停电发生在运行5分钟,有时30分钟,等等。
我经历了关闭代码段的过程,直到问题停止。将其缩小越来越多,发现它与使用深度缓冲区有关。换句话说,当我注释掉glEnable(GL_ENABLE_DEPTH_TEST)
时,问题就消失了。所以问题似乎与使用深度缓冲区有关。
据我所知,在重绘完成之前,深度缓冲区正在被清除。在glClear
调用周围有if语句,因此我将消息放入其中并确认即使发生停电时深度缓冲区的glClear
确实发生了。此外,glGetError
没有返回任何内容。
2014年6月30日更新 看起来至少有一个人在看这个(谢谢,UltraJoe)。如果我没记错的话,事实证明它有时候交换缓冲区而没有先定义后缓冲区并向它绘制任何东西。之前对我来说并不明显,因为这是一个漫长的例程。还有其他一些我需要清理的小事,但我认为这是主要原因。
答案 0 :(得分:1)
您是如何创建OpenGL窗口/上下文的?您刚刚获得Motif主窗口的X11 Window句柄并在该窗口上创建了OpenGL上下文吗?或者你是否在Openif的Motif窗口中创建了一个自己的子窗口?
您不应该直接使用由工具包管理的任何窗口,除非这是用于独占OpenGL使用的一些窗口小部件。原因是,大多数工具包不会为每个元素创建一个自己的子窗口,也会重用其部分图形资源。
因此你应该为OpenGL创建一个自己的子窗口,也可以使用glXCreateWindow创建一个子窗口。
答案 1 :(得分:1)
这是一个老问题,我知道,但答案可能有助于其他人。
这听起来像是您为OpenGL窗口选择了不良视觉效果,或者您正在创建一个覆盖默认值的新色彩映射表。如果可能的话,为应用程序中的所有内容选择DirectColor 24平面视觉。 DirectColor视觉效果使用只读颜色单元格,但24个平面将允许每个支持的颜色可用于每个窗口,而无需覆盖颜色单元格。