Я пытаюсь создать простую программу 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, но я подумал, что все же лучше упомянуть об этом.
glCompileShader
в вашем коде. - person JWWalker   schedule 06.09.2012