Я пытаюсь скомпилировать простые шейдеры на моей машине 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
Вы должны добавить 'line +" \ n "' вместо '' \ n "+ line'. (Вероятно, это не исправит ошибку.) – leemes
Кроме того, почему вы даже читаете это по строкам? Вы можете [сразу прочитать весь файл] (http://stackoverflow.com/questions/2602013/read-whole-ascii-file-into-c-stdstring). – leemes
Другой возможной проблемой является тот факт, что вы только добавляете переменную-член строки, но не очищаете ее. Может ли быть так, что 'load_from_file' вызывается несколько раз или какая-то другая причина, по которой член может содержать данные перед вызовом? – leemes