【发布时间】: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),但这似乎没有任何作用。也许我在错误的上下文中调用它?不过,我不知道还能在哪里调用它。
【问题讨论】: