Что требуется для компиляции и запуска программ GLSL? - PullRequest
3 голосов
/ 17 декабря 2009

Я пытаюсь запустить пример GLSL , но не могу.

Ошибка в строке glGetShaderiv(vShader, GL_COMPILE_STATUS, &status);, где выходит программа. vShader это файл vPhong.glsl.

Возвращенная ошибка:

0(18) : error C0000: syntax error, unexpected $undefined at token "<undefined>"
0(18) : error C0501: type name expected at token "<undefined>"

Я «установил» и ссылался на GLEW и Glut и их lib-файлы. Я glewInit редактировал мою программу.

Программа умеет находить .glsl-файлы.

Странно то, что я могу запустить предварительно скомпилированную GLSL-демонстрацию , а также скомпилировать и запустить проект на моем компьютере. «Инициализации» в нерабочей программе и это то же самое.

Я попытался скопировать дефектный источник в успешный проект, чтобы проверить, не было ли что-то в настройках проекта, вызвавшее ошибку, но, к сожалению, это не так. Так что, похоже, ошибка в коде C ++, а не в проекте.


ПРОГРЕСС:

На моей Windows 7-машине я получил «Нарушение прав доступа» при работе через Visual Studio. Программа просто перестала работать, если я запустил ее «один». На Windows XP-машине я получил необдуманное исключение.

Я не получил ошибок или предупреждений (кроме предупреждения о том, что fopen небезопасен), когда я компилировал программу.

Visual Studio выделил строку vShader = glCreateShader(GL_VERTEX_SHADER); в качестве источника ошибки.

Добавление glewInit(); исправило вышеуказанные ошибки.

Ответы [ 4 ]

4 голосов
/ 21 декабря 2009

В программе было две ошибки :

Во-первых:

glLinkProgram(program);
glGetShaderiv(program, GL_LINK_STATUS, &status);

Последняя строка должна была быть glGetProgramiv(program, GL_LINK_STATUS, &status);.

Кроме того, fopen, который читается в файлах шейдера, должен был использоваться с rb в качестве аргумента вместо r.

Замена glGetShaderiv на glGetProgramiv и добавление glewInit() исправили одну из моих начальных ошибок.

Изменение аргумента на fopen исправило ошибку шейдера.

1 голос
/ 21 декабря 2009

Эти ошибки происходят от компилятора GLSL, а не от компилятора C ++. В строке 18 в каком-то шейдере есть нечто, что сбивает с толку GLSL-компилятор; вероятно, случайный мусор или непечатный символ. Один из простых способов сделать это - указать слишком большую длину (или вообще не указывать длину) для вашего источника шейдера, и не иметь NUL-терминатора в конце строки

0 голосов
/ 18 декабря 2009

Это сообщение об ошибке обычно означает, что в самом файле программы шейдера есть какая-то ошибка. По моему опыту, это было что-то вроде неожиданного символа в начале или конце файла. Попробуйте скопировать и вставить текст с этого URL в блокнот или Gedit, а затем сохранить файл.

0 голосов
/ 17 декабря 2009

Я не уверен, как вы скомпилировали этот код. Он использует GL API, который не доступен напрямую в Windows SDK. Все API шейдеров находятся в этой категории.

Чтобы получить к ним доступ в Windows, вам обычно нужно использовать механизм расширения, предоставляемый wgl, или использовать оболочку расширения.

[изменить, чтобы добавить]

Итак ... с glew init с дороги! Компиляция шейдера предоставляет журнал сборки при сбое сборки (взято из этого руководства ):

GLint blen = 0; 
GLsizei slen = 0;

glGetShaderiv(ShaderObject, GL_INFO_LOG_LENGTH , &blen);       

if (blen > 1)
{
 GLchar* compiler_log = (GLchar*)malloc(blen);

 glGetInfoLogARB(ShaderObject, blen, &slen, compiler_log);
 cout << "compiler_log:\n", compiler_log);
 free (compiler_log);
}
...