OpenGL着色器程序无法验证但未提供错误消息

时间:2017-07-03 08:57:12

标签: c++ opengl glsl clion

我正在开发自定义游戏引擎,到目前为止一切正常 直到我偶然发现了一个奇怪的错误 当我尝试验证我的着色器程序时,它返回GL_FALSE,以确保良好的调试我检查错误消息的日志信息当出现故障时,但是这个错误没有信息日志消息,我检查它是否正确读取文件并且有那里没有错误...所以我有点卡住了,我在互联网上看都没有任何成功,我希望这里有人可以帮我解决这个问题。
提前谢谢!

在main函数中,我创建了一个带有2个着色器文件的新着色器程序,一个顶点着色器和一个片段着色器,两者都编译没有任何错误。

    GLuint shaderProgram = glCreateProgram();
    std::string vertexFile = FileUtils::read_file("shaders/basic.vert");
    std::string fragmentFile = FileUtils::read_file("shaders/basic.frag");

    const char* vertexSource = vertexFile.c_str();
    const char* fragmentSource = fragmentFile.c_str();

    GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex, 1, &vertexSource, NULL);
    glCompileShader(vertex);

    GLint result;
    glGetShaderiv(vertex, GL_COMPILE_STATUS, &result);
    if (result != GL_TRUE)
    {
        GLint length;
        glGetShaderiv(vertex, GL_INFO_LOG_LENGTH, &length);
        std::vector<char> error(length);
        glGetShaderInfoLog(vertex, length, &length, &error[0]);
        std::cerr << "Failed to compile the vertex shader!" << std::endl;
        std::cerr << &error[0] << std::endl;
        glDeleteShader(vertex);
        return -1;
    }
    glAttachShader(shaderProgram, vertex);

    GLuint fragment = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(fragment, 1, &fragmentSource, NULL);
    glCompileShader(fragment);

    glGetShaderiv(fragment, GL_COMPILE_STATUS, &result);
    if (result != GL_TRUE)
    {
        GLint length;
        glGetShaderiv(fragment, GL_INFO_LOG_LENGTH, &length);
        std::vector<char> error(length);
        glGetShaderInfoLog(fragment , length, &length, &error[0]);
        std::cerr << "Failed to compile the fragment shader!" << std::endl;
        std::cerr << &error[0] << std::endl;
        glDeleteShader(fragment);
        return -1;
    }
    glAttachShader(shaderProgram, fragment);

    glValidateProgram(shaderProgram);
    glGetProgramiv(shaderProgram, GL_VALIDATE_STATUS, &result);
    if (result != GL_TRUE)
    {
        GLint length;
        glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &length);
        std::vector<char> error(length);
        glGetProgramInfoLog(shaderProgram, length, &length, &error[0]);
        std::cerr << "Failed to validate the shader program!" << std::endl;
        std::cerr << &error[0] << std::endl;
        glDeleteProgram(shaderProgram);
        return -1;
    }
    glLinkProgram(shaderProgram);
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &result);
    if (result != GL_TRUE)
    {
        GLint length;
        glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &length);
        std::vector<char> error(length);
        glGetProgramInfoLog(shaderProgram, length, &length, &error[0]);
        std::cerr << "Failed to link the shader program!" << std::endl;
        std::cerr << &error[0] << std::endl;
        glDeleteProgram(shaderProgram);
        return -1;
    }
    glUseProgram(shaderProgram);

这是我的FileUtils类的read_file函数:

std::string FileUtils::read_file(const char* filepath)
{
    FILE* file = fopen(filepath, "rt");
    fseek(file, 0, SEEK_END);
    unsigned long length = ftell(file);
    char data[length + 1];
    memset(data, 0, length + 1);
    fseek(file, 0, SEEK_SET);
    fread(data, 1, length, file);
    fclose(file);

    std::string result(data);
    return result;
}

我知道它正确加载文件,因为我将它们打印到控制台以确保路径和文件是正确的,没有错误!

P.S。
如果您在代码中看到任何错误(例如“着色器”作为变量名称),那是因为我必须编辑原始代码以使其完全适合1个代码块。

1 个答案:

答案 0 :(得分:1)

glValidateProgram应放在glLinkProgram之后,但应放在glUseProgram之前。

来自here的引用:

  

glValidateProgram检查是否包含可执行文件   程序可以在当前的OpenGL状态下执行

如果程序尚未链接,则无法执行。