我正在使用QML,并希望运行自定义OpenGL代码。我用C ++创建了一个自定义Widget(扩展了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)
,但这似乎没有做任何事情。也许我在错误的背景下调用它?但是,我不知道我能在哪里调用它。
答案 0 :(得分:4)
事实证明,我的所有模型(包括蜘蛛)都有不正确的顶点法线,因此阴影问题。我应该在其他渲染软件中检查它们。
glFormat.setDepthBufferSize(1)
是真正的解决方案
答案 1 :(得分:1)