我将 QGLWidget 子类化,并将我的绘画代码放在 paintEvent 而不是 paintGL 中,因为我想使用 QPainter 在使用 OpenGL 完成的 3D 内容上绘制 2D 叠加层。
当我没有覆盖时,我的深度缓冲工作正常。如果叠加层被绘制,我的深度缓冲区就会离开:我可以看到应该被前面的对象隐藏的东西。
初始化GL看起来像这样:
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();
根据 if,相同的场景看起来不错(覆盖关闭)或错误(覆盖打开)。除了奇怪的深度缓冲问题之外,它工作得非常好。
我的(疯狂的)猜测是 QPainter 的构造禁用了深度缓冲。任何提示将不胜感激。我想一个后备解决方案是将我的叠加层渲染为纹理并让 OpenGL 将其混合。