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

17

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

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

就像它预测的那样,我确实遇到了渲染错误。我将以一个蜘蛛模型为例。以下是应该的样子:

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

    }
}

现在我只遇到了模板错误,但这导致了另一个问题。一侧完全是黑色的,没有显示任何光照。

在这里输入图片描述

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

MyGLWidget {
    id: glWidget
}

在我的渲染器的paint()函数中,我在顶部调用了glEnable(GL_DEPTH_TEST)glEnable(GL_STENCIL_TEST),但好像没有任何作用。也许我是在错误的上下文中调用它们?然而,我不知道在哪里还能调用它们。

2个回答

5
事实证明,我所有的模型(包括蜘蛛)都有错误的顶点法线,所以出现了着色问题。我应该在其他渲染软件中检查它们。
真正的解决方法是glFormat.setDepthBufferSize(1)

1

尝试

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

另请参阅场景图和渲染

很遗憾没有改变任何东西。我会查看链接,看看能否找到解决方案。 - faraza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接