Невозможно получить сообщение об ошибке из 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

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

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

#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, но я подумал, что в любом случае лучше упомянуть об этом.

1 ответ

Решение

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

Другие вопросы по тегам