【问题标题】:Depth Buffer and Stencil Buffer Issues QML深度缓冲区和模板缓冲区问题 QML
【发布时间】:2016-01-31 17:30:12
【问题描述】:

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

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

正如它所预测的那样,我确实遇到了渲染错误。我将以蜘蛛模型为例。应该是这样的

这就是我得到的

我也不知道具体怎么形容,但基本上相反的面(应该被前面挡住)在我旋转时会透出来。

我已经设法消除了深度缓冲区错误:

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),但这似乎没有任何作用。也许我在错误的上下文中调用它?不过,我不知道还能在哪里调用它。

【问题讨论】:

    标签: c++ qt opengl qml


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      试试

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

      另见Scene Graph and Rendering

      【讨论】:

      • 遗憾的是没有改变任何东西。我会看一下链接,看看我是否能找到解决方案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 2020-03-16
      • 1970-01-01
      • 2016-09-01
      相关资源
      最近更新 更多