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

GLSL VertexShader works with Qt but not plain OpenGL(SL)

我目前正在 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();

接下来我自己上传编译shader:

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"

我该如何进行这项工作?

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

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

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

我能给你的唯一建议是首先决定你 want/have 的目标 OpenGL 版本。