Qt5 OpenGL GLSL版本错误。

4

我刚开始使用Qt及OpenGL以及着色器(我有OpenGL经验,但尚未接触过着色器)。

我正在按照以下教程学习:http://releases.qt-project.org/learning/developerguides/qtopengltutorial/OpenGLTutorial.pdf(官方Qt5 OpenGL教程)。

问题是,当我尝试运行我的程序时,屏幕变成黑色,并出现以下错误消息:

QGLShader::compile(Vertex): ERROR: 0:1: '' :  version '130' is not supported

QGLShader::compile(Fragment): ERROR: 0:1: '' :  version '130' is not supported

我的程序基于QGLWidget。
在网上浏览一番后,我发现需要使用OpenGL 3.2上下文,但是Qt喜欢使用OpenGL 2.x。
我的电脑:
- MacBook Pro Retina '15,2012年末 - Intel HD 4000 - NVidia GeForce 650M
那么,我该如何解决这个问题呢?
编辑:
我的版本是3.2(通过QGLFormat设置),如果没有指定格式,则使用2.0。
fragmentShader.frag:
#version 130

uniform vec4 color;

out vec4 fragColor;

void main(void)
{
    fragColor = color;
}

vertexShader.vert:

#version 130

uniform mat4 mvpMatrix;

in vec4 vertex;

void main(void)
{
    gl_Position = mvpMatrix * vertex;
}

错误(格式、OpenGL 3.2):

QGLShaderProgram: shader programs are not supported 
QGLShaderProgram::uniformLocation( mvpMatrix ): shader program is not linked 
The program has unexpectedly finished.

错误(未格式化,OpenGL 2.0):

QGLShader::compile(Vertex): ERROR: 0:1: '' :  version '130' is not supported

QGLShader::compile(Fragment): ERROR: 0:1: '' :  version '130' is not supported

你能否在消息中添加触发这些错误的着色器呢?(当然,假设仅从着色器源中删除“#version 130”不能使它们正常工作) - peppe
着色器已经包含了#version 130,这就是它不能工作的原因。 - Dirk
请问您能否在您的帖子中添加所使用着色器的来源?另外,您能否说明您正在使用的Qt版本,并转储您获得的OpenGL上下文的确切版本?(通过 glwidget->context()->format().majorVersion()minorVersion)。 - peppe
我已经在我的帖子中放置了我的版本、着色器和错误信息。 - Dirk
3个回答

6

较新版本的QOpenGLWidget不支持任何带有QGLFormat的构造函数。相反,在你的main.cpp中,为所有QOpenGLWidgetQOpenGLContext指定默认的QSurfaceFormat,如下所示:

// main.cpp
QSurfaceFormat glFormat;
glFormat.setVersion(3, 3);
glFormat.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(glFormat);

现在你应该能够在你的着色器中使用类似 #version 330 core 的语句了。

1
请注意,在实例化您的QApplication之前完成此操作。 - Tomás Ferrer

2

您应该创建一个QGLFormat对象,并将其作为构造函数参数传递给QGLWidget。如下所示创建QGLFormat对象。

QGLFormat glFormat;
glFormat.setVersion( 3, 2 );
glFormat.setProfile( QGLFormat::CoreProfile );

那样解决了那些错误,但是却给我带来了这个错误:QGLShaderProgram:不支持着色器程序 - Dirk
QGLShaderProgram是一个小包装器,基本上使事情变得更容易 - 但实际上并不需要。我在Github上创建了一个简单的OpenGL 3.2 Qt示例,您可以用作灵感:https://github.com/mortennobel/QtOpenGL3.2Core - Mortennobel
Qt 5.0 更喜欢 OpenGL 2.0(正如您所知)。如果您想使用 Qt OpenGL 抽象层,我建议您安装 Qt 5.1 beta 版本,它更好地支持现代 OpenGL(http://www.kdab.com/opengl-in-qt-5-1-part-1/)。 - Mortennobel
我已经这样做了,但现在我得到了这个错误:`QGLShader :: compile(Vertex):ERROR:0:1:'':版本“130”不受支持 ERROR:0:2:'':#version必需且缺失。QGLShader :: compile(Fragment):ERROR:0:1:'':版本“130”不受支持 ERROR:0:2:'':#version必需且缺失。` - Dirk
“Qt 5.0 偏爱 OpenGL 2.0”是错误的(也是无意义的。Qt 不会“偏爱”任何东西)。 - peppe
@user1833511 你确定你正在使用QT 5.1.0吗?尝试使用:qDebug() << QT_VERSION_STR; - Mortennobel

0

我在我的MacBook(2011年早期)上遇到了同样的错误,this answer 帮助了我。基本上,你需要将版本降级到120。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接