GLSL VertexShader适用于Qt但不适用于普通的OpenGL(SL)

时间:2015-07-04 10:23:51

标签: c++ qt opengl glsl

我目前正在Qt中开发一个基于QOpenGLWidget的OpenGL-Widget。我按照一些例子使用GLSL-Wrapper进行演示。出于兼容性目的,应用程序本身应尽可能独立,例如更改GUI框架。

当Qt代码处理着色器时,应用程序正常工作:

QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
const char *vsrc =
    "uniform mediump mat4 matrix;\n"
    "void main(void)\n"
    "{\n"
    "    gl_Position = matrix * gl_Vertex;\n"
    "    gl_FrontColor = gl_Color;\n"
    "}\n";

bool success = vshader->compileSourceCode(vsrc);

program = new QOpenGLShaderProgram();
program->addShader(vshader);
program->link();

接下来,我自己上传并编译着色器:

const char *vsrc =
    "uniform mediump mat4 matrix;\n"
    "void main(void)\n"
    "{\n"
    "    gl_Position = matrix * gl_Vertex;\n"
    "    gl_FrontColor = gl_Color;\n"
    "}\n";
GLuint programmID = glCreateProgram();
GLuint shaderID = glCreateShader(GL_VERTEX_SHADER);
int length =(int) std::char_traits<char>::length(vsrc);
glShaderSource(shaderID, 1, &vsrc, &length);
glCompileShader(shaderID);
char *error = new char[1000];
int* messagelength = new int;
glGetShaderInfoLog(shaderID, (GLsizei)1000, messagelength, error);
string str = string(error, *messagelength);
std::cout << str << std::endl << std::flush;
delete error;
delete messagelength;
glAttachShader(programmID, shaderID);
glDeleteShader(shaderID);
glLinkProgram(programmID);
glUseProgram(programmID);

但是,这会导致以下错误:

0(1) : error C0000: syntax error, unexpected type identifier, expecting '{' at token "mat4"
0(4) : warning C7506: OpenGL does not define the global type matrix
0(4) : warning C7531: pointers requires "#extension GL_NV_shader_buffer_load : enable" before use
0(4) : error C0000: syntax error, unexpected identifier, expecting '(' at token "gl_Vertex"

我如何使这项工作?

1 个答案:

答案 0 :(得分:1)

嗯,您的代码在桌面版GL中无效。由于着色器不包含#version指令,因此将其解释为GLSL 1.10。并且该版本不知道像mediump这样的精度限定符。 (稍后只接受这些关键字,以提高与GLSL ES的兼容性。)

请注意,Qt可能很好地使用GL ES 2.0作为默认值(而不是桌面GL),具体取决于您的本地配置以及qt库的构建方式。

另请注意,在桌面GL的现代核心配置文件中,着色器完全无效。

我能给你的唯一建议是首先确定你想要/必须定位的OpenGL版本。