Шейдерная программа OpenGL не проходит проверку, но не выдает сообщения об ошибке

Я работаю над своим собственным игровым движком, и до сих пор все работает нормально.
Пока я не наткнулся на странную ошибку.
Когда я пытаюсь проверить свою шейдерную программу, она возвращает GL_FALSE, чтобы обеспечить хорошую отладку, я проверяю информация журнала для сообщений об ошибках, когда что-то терпит неудачу, но эта ошибка не имеет сообщения журнала информации, я проверил, правильно ли он читает файлы, и там нет ошибки ... Так что я как бы застрял, я посмотрел все через Интернет без какого-либо успеха, я надеюсь, что кто-то здесь может помочь мне с этим.
Заранее спасибо!

В основной функции я создаю новую шейдерную программу с двумя файлами шейдеров, вершинным шейдером и фрагментным шейдером, оба компилируются без ошибок.

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

Вот функция read_file из моего класса FileUtils:

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 блок кода для этого.


person Tripl3Fac3    schedule 03.07.2017    source источник
comment
Вам не нужно добавлять решено к заголовку. Приняв ответ, вы сказали другим, что вопрос теперь решен. Спасибо.   -  person Bugs    schedule 03.07.2017


Ответы (1)


glValidateProgram следует размещать после glLinkProgram, но перед glUseProgram.

Цитата из здесь:

glValidateProgram проверяет, могут ли исполняемые файлы, содержащиеся в программе, выполняться с учетом текущего состояния OpenGL.

Если программа еще не связана, она не может быть выполнена.

person geza    schedule 03.07.2017
comment
О, да, перепутал, теперь ошибка исчезла, но фрагментный шейдер, похоже, тоже не работает, я настроил его на вывод цвета vec4(1.0, 0.0, 1.0, 1.0), но он остается белым, может быть просто ошибка, спасибо за то, что напомнил мне об этой маленькой ошибке :D - person Tripl3Fac3; 03.07.2017