Что не так с этим кодом gsl?

Я пытаюсь загрузить простую программу GLSL из файла .txt. Вот функция, которая загружает файл:

string getShaderSource(char path[])
{
    string out;
    ifstream mFile;
    stringstream buf;
    mFile.open(path);
    if (mFile.is_open())
    { 
        buf << mFile.rdbuf();
        out = buf.str();
    }
    else
        printf("Cannot open shader source file.");      
    mFile.close();
    //out.append("\0");
    return out;
}

И я использую функцию следующим образом:

string vs = getShaderSource("C:/vs.txt");
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, (const GLchar**)&vs, NULL);

Проблема в том, что шейдер не компилируется несмотря ни на что, вот ошибка:

0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"

Очень простой код GLSL:

#version 410 
layout (location = 0) in vec3 vp;
layout (location = 1) in vec3 color;
smooth out vec4 theColor;
void main () {
    gl_Position = vec4 (vp, 1.0);
    theColor = vec4(color, 0.0);
}

Я знаю, что есть похожие вопросы, я много пытался решить проблему, но безуспешно. Что я делаю не так?


person Amol Borkar    schedule 26.01.2015    source источник
comment
Вы показали код, который загружает исходный код шейдера, но проблема заключается в компиляции исходного кода шейдера. Пожалуйста, покажите это. Чтобы исключить загрузчик исходного кода шейдера, временно жестко запрограммируйте исходный код шейдера и посмотрите, получите ли вы такое же сообщение.   -  person    schedule 26.01.2015
comment
какого типа vs?   -  person Axalo    schedule 26.01.2015
comment
@Axalo std::string, извините, что fs была опечаткой.   -  person Amol Borkar    schedule 26.01.2015
comment
@Poldie Да, я пытался сохранить код GLSL как const char*, и он отлично работает, но не тогда, когда я пытаюсь загрузить его из файла. Я думаю, что что-то не так с моей функцией загрузки txt файла.   -  person Amol Borkar    schedule 26.01.2015
comment
Лучше принять указатель на символ, потому что массивы должны быть инициализированы (это ссылки). OpenGL не понимает строку, поэтому не рекомендуется возвращать ее, а затем выполнять уродливое преобразование типов. Лучше просто преобразовать строку в char*, а затем передать ее. Кроме того, добавьте фрагментный шейдер, иначе вы не увидите никакого цвета.   -  person Poriferous    schedule 26.01.2015
comment
Фрагментный шейдер @Poriferous также находится в другом текстовом файле, приведенная выше ошибка отображается для обоих.   -  person Amol Borkar    schedule 26.01.2015


Ответы (2)


В следующей строке:

glShaderSource(vertexShader, 1, (const GLchar**)&vs, NULL);

Вы вводите std::string в GLchar**. Это не сработает.

Измените его на

const char *s = vs.c_str();
glShaderSource(vertexShader, 1, (const GLchar**)&s, NULL);

См. здесь.

person Axalo    schedule 26.01.2015
comment
VS дает сообщение об ошибке: выражение должно быть lvalue или указателем функции - person Amol Borkar; 26.01.2015
comment
Программа запускается, вершинный и фрагментный шейдер успешно компилируются, но цвета нет. Есть идеи почему?? - person Amol Borkar; 26.01.2015
comment
@EdwardMckinzie ты хоть что-нибудь видишь? - person Axalo; 26.01.2015
comment
Да, это обычный прямоугольник с разными цветами, но виден только белый прямоугольник. Вы можете проверить весь код здесь: pastebin.com/download.php?i=Cegtj63J - person Amol Borkar; 26.01.2015
comment
@EdwardMckinzie, этот код на самом деле не помогает. В любом случае, я предлагаю вам задать еще один вопрос, так как здесь есть много других людей, которые также могут вам помочь. - person Axalo; 26.01.2015

string fs = getShaderSource("C:/vs.txt");
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, (const GLchar**)&vs, NULL);

это подозрительно. Правильный код будет примерно таким:

string fs = getShaderSource("C:/vs.txt");
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);

char* vs = fs.c_str();
glShaderSource(vertexShader, 1, (const GLchar**)&vs, NULL);

Не гарантируется, что первым членом std::string будет char*, который содержит данные, вместо этого получите указатель явно в переменной и передайте указатель на эту переменную.

person ratchet freak    schedule 26.01.2015