glUniformMatrix4fv-操作无效

时间:2019-05-25 20:22:26

标签: c opengl opengl-4

上下文:

  • OpenGL C API 4.1(“现代” opengl)

问题:

我正在使 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.idshader2_program.id,它们是有效的,并且具有不同的值,可以。

我已经打印了uniform1uniform2,它们具有相同的数值。


声明和绑定制服是否正确?

1 个答案:

答案 0 :(得分:2)

  

shader1_program.idglCompileShader函数中已编译的 shader1 代码的结果。 shader2_program.id是通过glCompileShader函数编译的 shader2 代码的结果。
  – 12个小时前的Alrick

那么那就是问题。 glUseProgram需要一个程序对象,而不是一个着色器对象

您可以通过调用glCreateProgram创建程序对象,然后将编译后的着色器阶段附加到glAttachShader,然后再调用glLinkProgram。您不能直接在着色器上调用glUseProgram