Не удалось получить сообщение об ошибке из glGetShaderInfoLog.

Я пытаюсь создать простую программу OpenGL 3.2, состоящую из одного фрагментного шейдера, но, похоже, я не могу скомпилировать шейдер. Я почти уверен, что синтаксис моего шейдера верен, но даже если это не так, я не могу получить сообщение об ошибке с помощью glGetShaderInfoLog.

Я разработал короткую программу, которая показывает это в действии:

GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);

const char *shaderData =
            "#version 120\n"
            "void main()\n"
            "{\n"
            "    gl_FragColor = gl_Color;\n"
            "}\n";
glShaderSource(shader, 1, &shaderData, NULL);

GLint status;
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);

if (status == GL_FALSE)
{
    GLint infoLogLength;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);

    GLchar* strInfoLog = new GLchar[infoLogLength + 1];
    glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);

    fprintf(stderr, "Compilation error in shader %s: %s\n", this->name, strInfoLog);
    delete[] strInfoLog;
}

Это дает сообщение:

Ошибка компиляции в шейдере Fragment Shader:

Похоже, проблема в том, что вызов getShaderiv для получения значения GL_INFO_LOG_LENGTH каждый раз возвращает 0, поэтому я выделяю пустую строку. Я попытался жестко запрограммировать это значение на 100, но по-прежнему ничего не получаю от getShaderInfoLog.

Моя задача здесь не в том, чтобы исправить шейдер (я могу сделать это сам, если он неправильный), а в том, чтобы получить отладочную информацию. Я знаю, что это можно сделать, потому что использовал Shader Maker для краткой разработки шейдеров, и я могу получать очень подробные отладочные сообщения. Например:

ERROR: 0:11: 'undefined_variable' : syntax error syntax error

Если у Shader Marker нет собственного внутреннего инструмента проверки, я уверен, что он должен использовать тот же метод, который я пытаюсь использовать. Я видел в Интернете несколько примеров, в которых люди получают сообщение об ошибке для шейдера таким же образом, поэтому я вполне уверен, что делаю это правильно.

Теперь я получаю предупреждение во время компиляции, которое потенциально может объяснить эту проблему:

#warning gl.h and gl3.h are both included. Compiler will not invoke errors if using removed OpenGL functionality.

После выполнения полнотекстового поиска я нигде не могу найти, где я вызываю #include <OpenGL/gl.h>, поэтому я предполагаю, что этот заголовок включается одним из классов NSOpenGL*. Я почти уверен, что не использую какие-либо удаленные функции в этой короткой программе, и эта проблема имеет только около 5 обращений в Google, но я подумал, что все же лучше упомянуть об этом.


person Steve Rukuts    schedule 05.09.2012    source источник
comment
Я не вижу glCompileShader в вашем коде.   -  person JWWalker    schedule 06.09.2012
comment
О мой Бог! Не могу поверить, что я пропустил это! Теперь я получаю сообщение об ошибке, как и ожидалось. Я предлагаю вам написать это как ответ на этот вопрос, чтобы я мог отметить это как решенное. Вот что бывает, когда пишешь до утра.   -  person Steve Rukuts    schedule 06.09.2012
comment
Я мог представить, как пишу этот вопрос и точно такой же последующий комментарий, как и ОП почти 6 лет спустя. SO - такой замечательный инструмент.   -  person arthropod    schedule 17.05.2018


Ответы (1)


Как отмечалось в предыдущем комментарии, вызов glCompileShader отсутствовал.

person JWWalker    schedule 06.09.2012