Qt & OpenGL - QGLWidget & QPainter: depth buffering
我将QGLWidget子类化,并将绘画代码包含在paintEvent中,而不是在paintGL中,因为我想使用QPainter在OpenGL完成的3D内容上绘制2D覆盖。
没有覆盖层时,深度缓冲效果很好。 如果覆盖层被绘制,我的深度缓冲区将变为AWOL:我可以看到应该被前面的对象隐藏的东西。
initializeGL看起来像这样:
1 2 3 4 | qglClearColor(Qt::black); glShadeModel(GL_FLAT); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); |
我的paintEvent代码的结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | makeCurrent(); ...openGLStuff... if (I need my overlay) { glPushAttrib(GL_ALL_ATTRIB_BITS); glMatrixMode(GL_PROJECTION); glPushMatrix(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); QPainter painter(this); ... do QPainter stuff ... glPushAttrib(GL_ALL_ATTRIB_BITS); glMatrixMode(GL_PROJECTION); glPushMatrix(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); } swapBuffers(); |
取决于if,同一场景看起来不错(重叠关闭)或错误(重叠打开)。 除了怪异的深度缓冲问题之外,它还可以很好地工作。
我的(疯狂的)猜测是QPainter的构造禁用了深度缓冲。 任何提示将不胜感激。 我想一个后备解决方案是将叠加层渲染为纹理,并用OpenGL将其混合。
为什么不根据需要仅启用和禁用深度测试? 您无需"初始化" OpenGL,它是一种状态机。 这些"初始化"语句属于您的图形代码,属于需要它们的上下文中。