简体   繁体   English

OpenGL着色器链接错误,没有错误消息

[英]OpenGL shader linking error with no error message

I've been trying to figure this one out for a long time, but can't manage to get things to work. 很长时间以来,我一直在试图解决这个问题,但是却无法使事情正常进行。 I want simply to compile/run my OpenGL program, but my shaders does not link correctly and I get no helpful error message. 我只想编译/运行我的OpenGL程序,但是我的着色器无法正确链接,并且没有得到有用的错误消息。 In one case the error is purely empty, and in the other case it is ??y? 在一种情况下,该错误纯为空,而在另一种情况下,其为??y? for some reason. 由于某些原因。

To create my program and compile my shaders, I have the following code: 要创建我的程序并编译我的着色器,我有以下代码:

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());
}

The shaders look like 着色器看起来像

#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;
}

With

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;
}

I try to generate error messages from the shaders by 我尝试通过以下方式从着色器生成错误消息

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;
    };
}

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

unable to link vertex shader 无法链接顶点着色器

unable to link fragment shader 无法链接片段着色器

??y? 是吗?

error build program error 502 : GL_INVALID_OPERATION 错误生成程序错误502:GL_INVALID_OPERATION

Does anyone have a guess why my shaders compile just fine but does not link? 有谁能猜出为什么我的着色器可以编译而不能链接?

You are calling getProgramiv(...,GL_LINK_STATUS,...) on shader objects . 您正在着色器 对象上调用getProgramiv(...,GL_LINK_STATUS,...) It doesn't make the slightest sense to even call that checkShader function twice - once for each shader object - when you try to get information about the program (of which there is only one). 当您尝试获取有关程序的信息(其中只有一个)时,甚至两次调用该checkShader函数(对于每个着色器对象一次)都没有丝毫意义。 And it also doesn't make sense to name the function that way, for the GL_LINK_STATUS case. 对于GL_LINK_STATUS情况,以这种方式命名该函数也没有意义。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM