我目前正在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"
我如何使这项工作?
答案 0 :(得分:1)
嗯,您的代码在桌面版GL中无效。由于着色器不包含#version
指令,因此将其解释为GLSL 1.10。并且该版本不知道像mediump
这样的精度限定符。 (稍后只接受这些关键字,以提高与GLSL ES的兼容性。)
请注意,Qt可能很好地使用GL ES 2.0作为默认值(而不是桌面GL),具体取决于您的本地配置以及qt库的构建方式。
另请注意,在桌面GL的现代核心配置文件中,着色器完全无效。
我能给你的唯一建议是首先确定你想要/必须定位的OpenGL版本。