我开始使用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
我的电脑:
那么,我怎样才能做到这一点?
编辑:
我的版本是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
答案 0 :(得分:4)
较新的QOpenGLWidget
不支持QGLFormat
的任何构造函数。相反,在main.cpp
中,为所有QSurfaceFormat
和QOpenGLWidget
指定默认QOpenGLContext
,如下所示:
// main.cpp
QSurfaceFormat glFormat;
glFormat.setVersion(3, 3);
glFormat.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(glFormat);
现在,您应该可以在着色器中使用#version 330 core
之类的内容。
答案 1 :(得分:2)
您应该创建一个QGLFormat
对象并将其作为构造函数参数传递给QGLWidget。应创建QGLFormat
对象,如下面的代码所示。
QGLFormat glFormat;
glFormat.setVersion( 3, 2 );
glFormat.setProfile( QGLFormat::CoreProfile );
答案 2 :(得分:0)
我的macbook上有同样的错误(2011年初),而this answer帮助了我。基本上你弃用到版本120。