我继承了QGLWidget并将我的绘画代码放在paintEvent中,而不是paintGL中,因为我想使用QPainter绘制2D覆盖在使用OpenGL完成的3D内容上。
如果没有叠加层,则深度缓冲正常工作。 如果绘制了叠加层,则我的深度缓冲区会消失:我可以看到本应被前面对象隐藏的东西。
initializeGL看起来像这样:
qglClearColor(Qt::black);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
我的paintEvent代码结构如下:
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();
根据条件语句,同一场景在关闭覆盖图层时看起来正常,在打开覆盖图层时看起来错误。除了奇怪的深度缓冲问题外,它完全正常工作。
我的(猜测)是QPainter构造禁用了深度缓冲。如果有任何提示将不胜感激。我想备用解决方案是将我的覆盖层渲染到纹理中,并让OpenGL混合它。