我正在使用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)
在顶部,但似乎并没有做任何事情。也许我在错误的上下文中称呼它?但是,我不知道还能在哪里打电话。
事实证明,我的所有模型(包括蜘蛛网)的顶点法线都不正确,因此存在阴影问题。我应该在其他渲染软件中检查过它们。
glFormat.setDepthBufferSize(1)
是真正的解决办法
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句