2015-01-26 3 views
-3

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

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); 
} 

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

+0

Вы указали код, загружающий источник шейдера, но проблема заключается в компиляции источника шейдера. Пожалуйста, покажите это. Чтобы исключить загрузчик исходников шейдера, временно скопируйте его источник шейдера и посмотрите, получилось ли у вас одно и то же сообщение. –

+0

какого типа 'vs'? – Axalo

+0

@Axalo std :: string, извините, что вещь fs была опечаткой. –

ответ

2

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

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

Вы закидывающие зЬй :: строки в GLchar **. Это не сработает.

Изменить его

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

См here.

+0

VS дает сообщение об ошибке: выражение должно быть lvalue или обозначение функции –

+0

@EdwardMckinzie да, я отредактировал ответ. – Axalo

+0

Программа работает, как вершина, так и фрагментарный шейдер скомпилируются успешно, но нет цвета. Любые идеи, почему? –

0
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*, который содержит данные, вместо того, чтобы получить указатель явно в переменную и передать указатель на эту переменную.