【问题标题】:OpenGL shader linking error with no error messageOpenGL着色器链接错误,没有错误消息
【发布时间】:2017-02-26 15:49:40
【问题描述】:

我一直在尝试解决这个问题很长时间,但无法让事情发挥作用。我只想编译/运行我的 OpenGL 程序,但我的着色器没有正确链接,而且我没有收到任何有用的错误消息。在一种情况下,错误是纯空的,而在另一种情况下,由于某种原因,它是??y?

要创建我的程序并编译我的着色器,我有以下代码:

GLuint buildProgram(const char* vertexShaderFile, const char* fragmentShaderFile)
{
    std::string vs = fileContents(vertexShaderFile);
    std::string fs = fileContents(fragmentShaderFile);
    return createProgram(vs.c_str(), fs.c_str());
}

着色器看起来像

#version 330
out vec4 out_color; 
void main()
{
    out_color = vec4(0.5, 0.5, 0.5, 0.5);
}

#version 330
in vec4 in_Position;
void main()
{
    gl_Position = in_Position;
}

GLuint createProgram(const char* vertexSource, const char* fragmentSource)
{
    GLuint vertexshader = createShader(vertexSource, GL_VERTEX_SHADER);
    GLuint fragmentshader = createShader(fragmentSource, GL_FRAGMENT_SHADER);
    GLuint program = glCreateProgram();

    glAttachShader(program, vertexshader);
    glAttachShader(program, fragmentshader);

    glLinkProgram(program);
    GLint ret;
    checkShader(vertexshader, GL_LINK_STATUS, &ret, "unable to link vertex shader");
    checkShader(fragmentshader, GL_LINK_STATUS, &ret, "unable to link fragment shader");

    glUseProgram(program);
    return program;
}

GLuint createShader(const char* source, GLenum shaderType)
{
    GLuint shader = glCreateShader(shaderType);
    glShaderSource(shader, 1, &source, NULL);
    glCompileShader(shader);
    GLint isCompiled = 0;
    checkShader(shader, GL_COMPILE_STATUS, &isCompiled, "shader failed to compile");
    if (isCompiled == GL_FALSE)
    {
        glDeleteShader(shader);
        return 0;
    }
    return shader;
}

我尝试从着色器生成错误消息

void checkShader(GLuint shader, GLuint type, GLint* ret, const char* onfail)
{
    switch(type) {
        case(GL_COMPILE_STATUS):
        glGetShaderiv(shader, type, ret);
        if(*ret == false) {
            int infologLength = 0;
            glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infologLength);
            GLchar buffer[infologLength];
            GLsizei charsWritten = 0;
            std::cout << onfail << std::endl;
            glGetShaderInfoLog(shader, infologLength, &charsWritten, buffer);
            std::cout << buffer << std::endl;
        }
        break;
    case(GL_LINK_STATUS):
        glGetProgramiv(shader, type, ret);
        if(*ret == false) {
            int infologLength =  0;
            glGetProgramiv(shader, GL_INFO_LOG_LENGTH, &infologLength);
            GLchar buffer[infologLength];
            GLsizei charsWritten = 0;
            std::cout << onfail << std::endl;
            glGetProgramInfoLog(shader, infologLength, &charsWritten, buffer);
            std::cout << buffer << std::endl;
        }
        break;
    default:
        break;
    };
}

运行 GLuint program = buildProgram("shaders/test.vert", "shaders/test.frag"); 给我以下输出:

无法链接顶点着色器

无法链接片段着色器

??y?

错误构建程序 错误 502:GL_INVALID_OPERATION

有人猜到为什么我的着色器编译得很好但没有链接吗?

【问题讨论】:

  • 着色器对象没有链接状态。改为查询着色器程序对象。

标签: c++ opengl glfw glew


【解决方案1】:

您正在 shader objects 上调用 getProgramiv(...,GL_LINK_STATUS,...)。当您尝试获取有关程序(其中只有一个)的信息时,甚至两次调用checkShader 函数(每个着色器对象一次)都没有任何意义。对于 GL_LINK_STATUS 的情况,以这种方式命名函数也没有意义。

【讨论】:

  • 好像我把东西弄混了。感谢您清除它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多