Я пытаюсь создать простую программу 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, но я подумал, что в любом случае лучше упомянуть об этом.
Как отмечалось в предыдущем комментарии, glCompileShader
звонок пропал.
Других решений пока нет …