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

far*_*aza 17 c++ opengl qt 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
Run Code Online (Sandbox Code Playgroud)

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

蜘蛛stl

而这就是我所得到的 在此输入图像描述

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

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

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);

    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

MyGLWidget {
    id: glWidget
}
Run Code Online (Sandbox Code Playgroud)

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

far*_*aza 5

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

glFormat.setDepthBufferSize(1) 是真正的修复