I'm trying out a tutorial for OpenGL, the shaders compiles successfully and I've also tried printing the source on console, they reflect exactly what's on the file but program cannot link.
[C++ source]
unsigned int createShaders() { // TODO: abstract
GLenum err = glewInit();
unsigned int ui_shader_vtx = glCreateShader(GL_VERTEX_SHADER);
unsigned int ui_shader_frag = glCreateShader(GL_FRAGMENT_SHADER);
int n_compile_result;
int n_compile_log_length;
const char* cs_src_vtx = str_shader_src("vtx_default.glsl").c_str();
const char* cs_src_frag = str_shader_src("frag_default.glsl").c_str();
glShaderSource(ui_shader_vtx, 1, &cs_src_vtx, NULL);
glCompileShader(ui_shader_vtx);
glGetShaderiv(ui_shader_vtx, GL_COMPILE_STATUS, &n_compile_result);
glGetShaderiv(ui_shader_vtx, GL_INFO_LOG_LENGTH, &n_compile_log_length);
if (n_compile_log_length > 0 && n_compile_result == GL_FALSE) {
std::vector<char> cs_compile_error(n_compile_log_length + 1);
glGetShaderInfoLog(ui_shader_vtx, n_compile_log_length, NULL, &cs_compile_error[0]);
std::cerr << "Error [0x00000003]: Shader Error: " << &cs_compile_error[0] << std::endl;
system("pause");
}
glShaderSource(ui_shader_frag, 1, &cs_src_vtx, NULL);
glCompileShader(ui_shader_frag);
glGetShaderiv(ui_shader_frag, GL_COMPILE_STATUS, &n_compile_result);
glGetShaderiv(ui_shader_frag, GL_INFO_LOG_LENGTH, &n_compile_log_length);
if (n_compile_log_length > 0 && n_compile_result == GL_FALSE) {
std::vector<char> cs_compile_error(n_compile_log_length + 1);
glGetShaderInfoLog(ui_shader_frag, n_compile_log_length, NULL, &cs_compile_error[0]);
std::cerr << "Error [0x00000003]: Shader Error: " << &cs_compile_error[0] << std::endl;
system("pause");
}
unsigned int ui_shader_prog_id = glCreateProgram();
glAttachShader(ui_shader_prog_id, ui_shader_vtx);
glAttachShader(ui_shader_prog_id, ui_shader_frag);
glLinkProgram(ui_shader_prog_id);
glGetProgramiv(ui_shader_prog_id, GL_LINK_STATUS, &n_compile_result);
glGetProgramiv(ui_shader_prog_id, GL_INFO_LOG_LENGTH, &n_compile_log_length);
if (n_compile_log_length > 0 && n_compile_result == GL_FALSE) {
std::vector<char> cs_link_error(n_compile_log_length + 1);
glGetProgramInfoLog(ui_shader_prog_id, n_compile_log_length, NULL, &cs_link_error[0]);
std::cerr << "Error [0x00000004]: glProgram Error: " << &cs_link_error[0] << std::endl;
system("pause");
}
glDetachShader(ui_shader_prog_id, ui_shader_vtx);
glDetachShader(ui_shader_prog_id, ui_shader_frag);
return ui_shader_prog_id;
}
[Vertex Shader]
#version 330 core
layout(location = 0) in vec3 vtx_pos;
void main () {
gl_Position.xyz = vtx_pos;
gl_Position.w = 1.0;
}
[Fragment Shader]
#version 330 core
out vec3 color;
void main() {
color = vec3(1.0,0.5,1.0);
}
Here's the console output:
vtx_default.glsl:
#version 330 core
layout(location = 0) in vec3 vtx_pos;
void main () {
gl_Position.xyz = vtx_pos;
gl_Position.w = 1.0;
}
frag_default.glsl:
#version 330 core
out vec3 color;
void main() {
color = vec3(1.0,0.5,1.0);
}
Error [0x00000004]: glProgram Error: Vertex shader(s) failed to link, fragment s
hader(s) failed to link.
ERROR: error(#280) Not all shaders have valid object code
ERROR: error(#280) Not all shaders have valid object code
Press any key to continue . . .
UPDATE
std::string str_shader_src(std::string str_filename) {
std::ifstream fs_file;
std::stringstream ss_src_buffer;
fs_file.open(str_filename);
if (fs_file.is_open()) {
ss_src_buffer << fs_file.rdbuf();
// debug
std::cout << str_filename << ":" << std::endl;
std::cout << ss_src_buffer.str() << std::endl;
return ss_src_buffer.str();
}
else {
std::cerr << "Unable to open shader file [" << str_filename << "]" << std::endl;
system("pause");
return NULL;
}
}
I cannot understand what seems to be wrong, on my code.
User contributions licensed under CC BY-SA 3.0