我正在使用QML,并希望运行自定义的OpenGL代码。我在C++中创建了一个自定义的小部件(扩展QQuickItem)并覆盖了paint函数()。
当我运行应用程序时,控制台会打印
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)
,但好像没有任何作用。也许我是在错误的上下文中调用它们?然而,我不知道在哪里还能调用它们。