2015-05-26 4 views
2

Я пытаюсь скомпилировать простые шейдеры на моей машине Linux с видеокартой Radeon HD 5470 и драйвером fglrx AMD.GLSL Shader ошибка компиляции

Мой вершинные шейдеры код

#version 330 core 

layout(location = 0) in vec3 vertexPosition_modelspace; 

void main() 
{ 

    gl_Position.xyz = vertexPosition_modelspace; 
    gl_Position.w = 1.0; 

} 

Чтение кода из файла

void Shader::load_from_file(const std::string& file) 
{ 
    std::ifstream is(file, std::ios_base::in); 
    if (is.is_open()) { 
     std::string line{""}; 
     while(std::getline(is, line)) { 
      // program_code_ is a std::string member 
      program_code_ += "\n" + line; 
     } 

     is.close(); 
    } else { 
     throw Exception("Could not open shader source code file"); 
    }  
} 

Попробуйте скомпилировать

void Shader::build_shader() 
{ 
    const GLchar* tmp = program_code_.c_str();  
    const GLint tmplen = program_code_.length(); 

    std::cout << "Shader code: " << tmp << std::endl; 

    glShaderSource(shader_handler_, 1, &tmp, &tmplen); 
    CHECK_ERR(); 

    glCompileShader(shader_handler_); 
    CHECK_ERR(); 
    //... 
} 

И есть ошибка из glGetShaderInfoLog

Exception caught: Vertex shader failed to compile with the following errors: 
ERROR: 0:1: error(#132) Syntax error: "<" parse error 
ERROR: error(#273) 1 compilation errors. No code generated 

Но прежде, чем звоню glShaderSource, я печатаю на стандартный вывод значения указателя TMP и, кажется, действительный код шейдера:

Shader code: 
#version 330 core 

layout(location = 0) in vec3 vertexPosition_modelspace; 

void main() 
{ 

    gl_Position.xyz = vertexPosition_modelspace; 
    gl_Position.w = 1.0; 

} 

Мой код не читает мусор из памяти, но я не могу понять, что случилось ,

Также

% glxinfo | grep vertex_program 
% GL_ARB_vertex_program 
+0

Вы должны добавить 'line +" \ n "' вместо '' \ n "+ line'. (Вероятно, это не исправит ошибку.) – leemes

+2

Кроме того, почему вы даже читаете это по строкам? Вы можете [сразу прочитать весь файл] (http://stackoverflow.com/questions/2602013/read-whole-ascii-file-into-c-stdstring). – leemes

+2

Другой возможной проблемой является тот факт, что вы только добавляете переменную-член строки, но не очищаете ее. Может ли быть так, что 'load_from_file' вызывается несколько раз или какая-то другая причина, по которой член может содержать данные перед вызовом? – leemes

ответ

1

Чтение файла построчно и конкатенации эти строки, как представляется, проблема.

Я не знаю, как это вводит ошибку, которая соответствует сообщению об ошибке, полученному вами из компилятора шейдеров, но, как предложено в комментариях, чтение всего файла сразу решает проблему.

Следующие строки читают из файла потока is путем использования функции rdbuf и stringstream (вам нужно #include <sstream>):

std::ostringstream contents; 
contents << is.rdbuf(); 
program_code_ = contents.str(); 

Для получения дополнительной информации об этом методе, и сравнения с другими методами, см http://insanecoding.blogspot.de/2011/11/how-to-read-in-file-in-c.html.