Qt & OpenGL - QGLWidget & QPainter: depth buffering



我子类QGLWidget,并有我的绘画代码在paintEvent而不是paintGL,因为我想画一个2D覆盖使用QPainter在我用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();

取决于if,相同的场景看起来是正确的(覆盖)或错误的(覆盖)。除了奇怪的深度缓冲问题,它工作得非常好。

我的猜测是QPainter的构造禁用了深度缓冲。任何提示都将非常感激。我想一个备用的解决方案是将我的覆盖渲染成纹理,并让OpenGL将其混合。

为什么不根据需要启用和禁用深度测试呢?你不会"初始化" OpenGL,它是一个状态机。这些"初始化"语句属于你的绘图代码,在需要它们的上下文中。

相关内容

  • 没有找到相关文章

最新更新