Ошибка компиляции GLSL при наличии более одного указателя на символ (glShaderSource) - PullRequest
0 голосов
/ 09 декабря 2011

Что не так с этим кодом для версии 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)

было недостаточно, его нужно указать при открытии, не нашел никакого документа для этого.

1 Ответ

0 голосов
/ 09 декабря 2011

Самой первой непустой строкой шейдера GLSL должна быть инструкция #version препроцессора.Все остальное является ошибкой.

...