深度缓冲区和模板缓冲区问题QML

时间:2015-10-31 10:11:46

标签: c++ qt opengl qml

我正在使用QML,并希望运行自定义OpenGL代码。我用C ++创建了一个自定义Widget(扩展了QQuickItem)并覆盖了paint函数()。
当我运行我的应用程序时,控制台打印

QSGContext::initialize: depth buffer support missing, expect rendering errors
QSGContext::initialize: stencil buffer support missing, expect rendering errors

就像它预测的那样,我确实会出现渲染错误。我将以蜘蛛模型为例。这是它应该是什么样的

spider stl

这就是我所得到的 enter image description here

我也不知道如何描述它,但基本上相反的脸(应该被正面阻挡)在旋转时显示出来。

我设法摆脱了深度缓冲区错误:

void MyGLWidget::handleWindowChanged(QQuickWindow *win)
{
    if (win) {
        connect(win, SIGNAL(beforeSynchronizing()), this, SLOT(sync()), Qt::DirectConnection);
        connect(win, SIGNAL(sceneGraphInvalidated()), this, SLOT(cleanup()), Qt::DirectConnection);
        win->setClearBeforeRendering(false);
        QSurfaceFormat glFormat;
        glFormat.setVersion(3,2);
        glFormat.setProfile(QSurfaceFormat::CoreProfile);




        /*I'm showing everything for context, but this is the key line*/
        glFormat.setDepthBufferSize(1); 






        win->setFormat(glFormat);

    }
}

所以现在我只得到模板错误,但这导致了另一个问题。一面是完全黑色的,并没有显示任何照明。

enter image description here

其他一些背景信息:我正在显示QQuickView。我的OpenGLWidget被导入到QML中并嵌入如下:

MyGLWidget {
    id: glWidget
}

在我的渲染器的paint()中,我在顶部调用了glEnable(GL_DEPTH_TEST)glEnable(GL_STENCIL_TEST),但这似乎没有做任何事情。也许我在错误的背景下调用它?但是,我不知道我能在哪里调用它。

2 个答案:

答案 0 :(得分:4)

事实证明,我的所有模型(包括蜘蛛)都有不正确的顶点法线,因此阴影问题。我应该在其他渲染软件中检查它们。

glFormat.setDepthBufferSize(1)是真正的解决方案

答案 1 :(得分:1)

尝试

glDepthMask(GL_TRUE); 
// your paintings here
glDepthMask(GL_FALSE);

另见Scene Graph and Rendering