4
votes

I'm starting out on using OpenGL with Qt, and with Shaders (I have OpenGL experience, but not with shaders yet)

I'm following this tutorial: http://releases.qt-project.org/learning/developerguides/qtopengltutorial/OpenGLTutorial.pdf (the official Qt5 OpenGL tutorial).

The problem is, that when I try to run my program, I get a black screen and the following error messages:

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

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

My program is based on a QGLWidget

With some browsing on the interwebs I found out that I need to use an OpenGL 3.2 context, but that Qt likes to use OpenGL 2.x

My computer:

  • MacBook pro retina '15, late 2012
  • Intel HD 4000
  • NVidia GeForce 650M

So, how can I make this work?

EDIT:

My version is 3.2 (set through QGLFormat), without a specified format it uses 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;
}

Errors (with format, OpenGL 3.2):

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

Errors (without format, 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
3
Can you add to your message the shaders that trigger those errors? (Assuming, of course, that just dropping #version 130 from the shader's source doesn't make them work) - peppe
The shaders already contain #version 130, that's the reason it doesn't work - Dirk
Still, could you please add the source of the shaders you're using to your post? Also, could you please state which Qt version you're using, and dump the exact version of the OpenGL context you get? (via glwidget->context()->format().majorVersion() and minorVersion). - peppe
I have put my version, shaders and errors in my post - Dirk

3 Answers

5
votes

Newer QOpenGLWidget doesn't support any constructor with QGLFormat. Instead, in your main.cpp, specify the default QSurfaceFormat for all QOpenGLWidget and QOpenGLContext as following:

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

Now you should be able to use something like #version 330 core in your shader.

2
votes

You should create an QGLFormat object and pass it to the QGLWidget as a constructor parameter. The QGLFormat object should be created as showed in the code below.

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

I've got the same error on my macbook (early 2011), and this answer helps me. Basically you deprecate to version120.