4

我开始将 OpenGL 与 Qt 和 Shaders 一起使用(我有 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 年末
  • 英特尔高清 4000
  • 英伟达 GeForce 650M

那么,我怎样才能使这项工作?

编辑:

我的版本是 3.2(通过 QGLFormat 设置),没有指定格式它使用 2.0

片段着色器.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
4

3 回答 3

5

较新QOpenGLWidget的不支持任何带有QGLFormat. 相反,在您的 中,为 allmain.cpp指定默认值,如下所示:QSurfaceFormatQOpenGLWidgetQOpenGLContext

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

现在你应该可以#version 330 core在你的着色器中使用类似的东西了。

于 2015-11-02T16:30:55.110 回答
2

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

QGLFormat glFormat;
glFormat.setVersion( 3, 2 );
glFormat.setProfile( QGLFormat::CoreProfile );
于 2013-06-30T14:56:52.217 回答
0

我的 macbook(2011 年初)也出现了同样的错误,这个答案对我有帮助。基本上你不推荐使用version120。

于 2014-10-06T13:26:44.727 回答