我正在使 INVALID OPERATION (装订无效)绑定错误地使用多个着色器:
// Getting ids for each uniform
GLuint uniform1 = glGetUniformLocation(shader1_program.id, "mvp");
GLuint uniform2 = glGetUniformLocation(shader2_program.id, "mvp");
loop {
// Print mesh 1 shader 1
glUseProgram(shader1_program.id);
glUniformMatrix4fv(uniform1 , 1, GL_FALSE, mvp1);
check_gl_error(); // =============================> this one provides the error
glBindVertexArray(vao1);
glDrawArrays(GL_TRIANGLES, 0, vertex_number1);
// Print mesh 2 with shader2
glUseProgram(shader2_program.id);
glUniformMatrix4fv(uniform2 , 1, GL_FALSE, mvp2);
check_gl_error();
glBindVertexArray(vao2);
glDrawArrays(GL_TRIANGLES, 0, vertex_number2);
}
这里是check_gl_error()
函数,该函数从glGetError
获取错误代码并显示符号:
typedef struct glmaperror_s {
GLenum err;
char *string_error;
} glmaperror_t;
static const glmaperror_t glmaperror[] = {
{ GL_INVALID_OPERATION, "GL_INVALID_OPERATION", },
{ GL_INVALID_ENUM, "GL_INVALID_ENUM", },
{ GL_INVALID_VALUE, "GL_INVALID_VALUE", },
{ GL_OUT_OF_MEMORY, "GL_OUT_OF_MEMORY", },
{ GL_INVALID_FRAMEBUFFER_OPERATION, "GL_INVALID_FRAMEBUFFER_OPERATION", },
};
int check_gl_error(void)
{
GLenum err;
char *error;
error = 0;
while ((err = glGetError()) != GL_NO_ERROR) {
error = "Unhandled GL error";
for (size_t i = 0; i * sizeof(glmaperror_t) < sizeof(glmaperror); i++) {
if (glmaperror[i].err == err) {
error = glmaperror[i].string_error;
}
}
fprintf(stderr, "[GL Error]: %s\n", error);
return (-1);
}
return (0);
}
这是两个着色器:
shader1 :
#version 410
in vec3 position;
in vec3 color;
out vec4 _color;
uniform mat4 mvp;
void main() {
gl_Position = mvp * vec4(position, 1.0);
_color = vec4(color, 255.0);
}
shader2
#version 410
in vec3 position;
uniform mat4 mvp;
void main() {
gl_Position = mvp * vec4(position, 1.0);
}
实际上,仅渲染网格2。
我已经打印了shader1_program.id
和shader2_program.id
,它们是有效的,并且具有不同的值,可以。
我已经打印了uniform1
和uniform2
,它们具有相同的数值。
声明和绑定制服是否正确?
答案 0 :(得分:2)
shader1_program.id
是glCompileShader
函数中已编译的 shader1 代码的结果。shader2_program.id
是通过glCompileShader
函数编译的 shader2 代码的结果。
– 12个小时前的Alrick
那么那就是问题。 glUseProgram
需要一个程序对象,而不是一个着色器对象。
您可以通过调用glCreateProgram
创建程序对象,然后将编译后的着色器阶段附加到glAttachShader
,然后再调用glLinkProgram
。您不能直接在着色器上调用glUseProgram
。