GLSL shaders compiled successfully, still program link error

-2

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.

c++
opengl
glsl
asked on Stack Overflow Apr 1, 2019 by Dominick Navarro • edited Apr 1, 2019 by Dominick Navarro

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0