2012-10-31 47 views
0

我有一个混合了OpenGL和Motif的应用程序。有OpenGL的大型主窗口重绘得很好。但是,坐在其上的子窗口全部变黑。具体来说,只是在主窗口顶部的那些子窗口的部分。这些子窗口都只有Motif代码(除了一个)。OpenGL窗口绘制得很好,但我的OpenGL窗口顶部的所有窗口都变黑了

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

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

据我所知,深度缓冲区在重绘完成前被清除,因为它应该如此。还有if语句包含在glClear调用中,所以我把消息放在那里,并确认深度缓冲区的glClear确实正在发生,即使发生停电。此外,glGetError未返回任何内容。

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

+1

任何人都很难在没有看到相关代码的情况下回答。 – Barmar

+0

不幸的是,这是一个很长的例程,我不会被允许在这里发帖。 – tealfan

+1

如果你没有得到很多帮助,请不要感到惊讶。 – Barmar

回答

1

你是如何创建OpenGL窗口/上下文的。你刚刚获得Motif主窗口的X11窗口句柄并在那个窗口上创建了OpenGL上下文吗?或者你是否在OpenGL的Motif窗口中创建了自己的子窗口?

您不应该直接使用由工具包管理的任何窗口,除非这是用于独占OpenGL的某个窗口小部件。原因是,大多数工具包不会为每个元素创建一个自己的子窗口,并且还会重用部分图形资源。

因此,您应该为OpenGL创建一个自己的子窗口,也可以使用glXCreateWindow进一步创建子窗口。

+0

完全不是子窗口,但是在主窗口中创建了一个XmForm来包含glwMDrawingArea,而不是其他任何东西。该表单的显示是GLXContext的父级。 – tealfan

+0

(对不起,输入关键问题。:)) 完全不是子窗口,而是在主窗口中创建了一个XmForm(称为glForm),以包含glwMDrawingArea,而不是其他任何东西。该表单的显示是GLXContext的父级。 现在,glForm被包含在主窗口中,与另一种形式(称为motifForm)完全是Motif。在重绘motifForm时没有任何问题。如果我真的需要将glForm放在它自己的窗口中,那将会是一个问题。需要将MotifForm和glForm保持在同一个窗口中。 – tealfan

+0

感叹。当我说“是GLXContext的父级”时,我应该说“是GLXContext的显示”。 – tealfan

1

这是一个古老的问题,我知道,但答案可能有助于别人。

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