Это бросает ошибку сегментации где-то внутри glCompileShader
Такие проблемы, как они, как правило, вызваны недоступный доступа к памяти. API из glShaderSource указан (версия 4.5) следующим образом (курсив мной):
команды
void glShaderSource(
GLuint shader,
GLsizei count,
const GLchar *const *string,
const GLint *length);
загружает исходный код в объектный шейдер имени шейдера. string - массив с указателями количества до , необязательно с нулевым завершением символ строки, составляющие исходный код. длина аргумент - массив с номером количество символов в каждой строке (длина строки). Если длина элемента отрицательна, его сопровождающая строка равна с нулевой остановкой. Если длина равна NULL, все строки в аргументе строки считаются нулевыми.
Это означает, что если вы не завершите нулевую строку своих шейдерных строк, OpenGL ожидает, что вы передадите ей информацию о длине или наоборот.
Почему это важно для вашего случая? Важным отличием двух источников шейдеров является длина строки источника шейдера. И вполне возможно, что после окончания более короткого источника может появиться пара нулевых байтов¹. И небольшая смена того, что ваша строка источника шейдера будет немного длиннее, может оказать огромное влияние на то, где она закончится в памяти и что произойдет после нее.
Итак, почему ваша строка источника шейдера не может быть завершена с нулевым значением? Например, если вы прочитали его из файла и выделите память как размер файла. В этом случае не будет символа нулевого завершения.
Вынос: либо правильно нуль-конец строк исходного кода шейдера, либо явно передать длину строки источника шейдера. Предпочтительно делать то и другое (он никогда не боится быть параноидальным в доступе к памяти за пределами границ).
1: Может быть, остатки от предыдущего распределения на то же место памяти, или, возможно, исходная строка была достаточно короткой, чтобы оно уместилось в одну страницу и реализацию таНоса решил, что запрос на новую странице будет уместно (и свежие страницы обычно читают ноль, если только явно не запрашивается их инициализация).
Да, извините за это. –
glCompileShader не должен segfault из-за неверного кода; Существует либо проблема с вашим драйвером, либо с кодом, который создает и компилирует шейдер. – pleluron
У вас есть контекст opengl, когда вы пытаетесь скомпилировать шейдер? Попробуйте проверить возвращаемое значение glGetString (GL_VERSION), чтобы проверить, есть ли у вас контекст или нет. – Zouch