glUniformMatrix4fv - 无效操作
glUniformMatrix4fv - INVALID OPERATION
上下文:
- OpenGL C API 4.1 ("modern" opengl)
问题:
我遇到了一个无效操作 以错误的方式使用多个着色器绑定制服:
// 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);
}
这是从 glGetError
获取错误代码并打印含义的 check_gl_error()
函数:
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
,它们的数值相同
申报和绑定制服的顺序正确吗?
shader1_program.id
is the result of the compiled shader1 code from the glCompileShader
function. shader2_program.id
is the result of the compiled shader2 code from the glCompileShader
function.
– Alrick 12 hours ago
那就是问题所在。 glUseProgram
需要 程序对象 ,而不是 着色器对象 。
您通过调用 glCreateProgram
创建程序对象,然后使用 glAttachShader
附加已编译的着色器阶段,然后调用 glLinkProgram
。您不能直接在着色器上调用 glUseProgram
。
上下文:
- OpenGL C API 4.1 ("modern" opengl)
问题:
我遇到了一个无效操作 以错误的方式使用多个着色器绑定制服:
// 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);
}
这是从 glGetError
获取错误代码并打印含义的 check_gl_error()
函数:
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
,它们的数值相同
申报和绑定制服的顺序正确吗?
shader1_program.id
is the result of the compiled shader1 code from theglCompileShader
function.shader2_program.id
is the result of the compiled shader2 code from theglCompileShader
function.
– Alrick 12 hours ago
那就是问题所在。 glUseProgram
需要 程序对象 ,而不是 着色器对象 。
您通过调用 glCreateProgram
创建程序对象,然后使用 glAttachShader
附加已编译的着色器阶段,然后调用 glLinkProgram
。您不能直接在着色器上调用 glUseProgram
。