Что не так с этим кодом для версии 3.30 OpenGL и GLSL?
const char *vertSrcs[2] = { "#define A_MACRO\n", vShaderSrc };
const char *fragSrcs[2] = { "#define A_MACRO\n", fShaderSrc };
glShaderSource(vId, 2, vertSrcs, NULL);
glShaderSource(fId, 2, fragSrcs, NULL);
Я собираю состояние шейдера с помощью GL_COMPILE_STATUS после его компиляции, получаю эту ошибку:
Vertex shader failed to compile with the following errors:
Целью этого макроса является изменение спецификатора типа для цвета, который я передал из вершины во фрагмент, возможно, есть другой способ сделать это, используя униформу и макет, но вопрос в том, почему шейдер потерпит неудачу?Интересно, есть ли другая команда OpenGL, которая должна указывать 2 указателя на символы?Кстати, это работает:
...
glShaderSource(vId, 1, &vertSrcs[1], NULL);
...
РЕДАКТИРОВАТЬ : поскольку я не могу ответить на свои собственные вопросы, нашел решение
Очень странная проблема, загрузчик строкбывает проблема.Без использования ifstream вместе с std :: ios :: in |std :: ios :: binary flags, строка была загружена с некоторой информацией о мусоре до конца, даже с завершенным нулем, поэтому конкатенация строк приведет к ошибке.По какой-то причине компилятор gl раньше не жаловался на одностроковую версию, кроме того, что вызова
inStream.flags(std::ios::in | std::ios::binary)
было недостаточно, его нужно указать при открытии, не нашел никакого документа для этого.