GLuint Shader::compileShader(GLuint &vShader, GLuint &fShader) { // Read in shader source char *vs = NULL, *fs = NULL; // Create the shader vShader = glCreateShader(GL_VERTEX_SHADER); fShader = glCreateShader(GL_FRAGMENT_SHADER); GLint shader_ok, program_ok; // Read in shader source vs = textFileRead(vert); if (!vs) { fprintf(stderr, "Error reading vertex shader file %s\n", vert); return 0; } fs = textFileRead(frag); if (!fs) { fprintf(stderr, "Error reading fragment shader file %s\n", frag); return 0; } glShaderSource(vShader, 1, (const GLchar**) &vs, NULL); glShaderSource(fShader, 1, (const GLchar**) &fs, NULL); free(vs);free(fs); // Compile the shaders glCompileShader(vShader); glGetShaderiv(vShader, GL_COMPILE_STATUS, &shader_ok); if (!shader_ok) { fprintf(stderr, "Failed to compile %s:\n", vert); show_info_log(vShader, glGetShaderiv, glGetShaderInfoLog); glDeleteShader(vShader); return 0; } glCompileShader(fShader); glGetShaderiv(fShader, GL_COMPILE_STATUS, &shader_ok); if (!shader_ok) { fprintf(stderr, "Failed to compile %s:\n", frag); show_info_log(fShader, glGetShaderiv, glGetShaderInfoLog); glDeleteShader(fShader); return 0; } // Create the program -- attaching your shaders GLuint program = glCreateProgram(); glAttachShader(program, vShader); glAttachShader(program, fShader); // Link the program glLinkProgram(program); glGetProgramiv(program, GL_LINK_STATUS, &program_ok); if (!program_ok) { fprintf(stderr, "Failed to link shader program:\n"); show_info_log(program, glGetProgramiv, glGetProgramInfoLog); glDeleteProgram(program); return 0; } return program; }
static GLuint make_shader(GLenum type, const std::string& filename)/*{{{*/ { /* Utility function to create a shader object from a file*/ GLint length; GLchar *source = (GLchar*)file_contents(filename.c_str(), &length); GLuint shader; GLint shader_ok; if (!source) return 0; // shader = glCreateShader(type); glShaderSource(shader, 1, (const GLchar**)&source, &length); free(source); glCompileShader(shader); // glGetShaderiv(shader, GL_COMPILE_STATUS, &shader_ok); if (!shader_ok) { std::cerr<<"Failed to compile "<<filename<<":"<<std::endl; show_info_log(shader, glGetShaderiv, glGetShaderInfoLog); glDeleteShader(shader); return 0; } else { // std::cout << filename << " compiled" << std::endl; } return shader; }/*}}}*/
static GLuint make_shader(GLenum type, const char *filename) { GLint length; GLchar *source = file_contents(filename, &length); GLuint shader; GLuint shader_ok; if(!source) { return 0; } shader = glCreateShader(type); glShaderSource(shader, 1, (const GLchar**)&source, &length); free(source); glCompileShader(shader); glGetShaderiv(shader, GL_COMPILE_STATUS, &shader_ok); if(!shader_ok) { fprintf(stderr, "Failed to compile %s \n", filename); show_info_log(shader, glGetShaderiv, glGetShaderInfoLog); glDeleteShader(shader); return 0; } return shader; }
void link_program(GLuint program)/*{{{*/ { /* Utility function to create a program object from two files*/ GLint program_ok; // glLinkProgram(program); // glGetProgramiv(program, GL_LINK_STATUS, &program_ok); if (!program_ok) { std::cerr<<"Failed to link shader program:"<<std::endl; show_info_log(program, glGetProgramiv, glGetProgramInfoLog); glDeleteProgram(program); } }/*}}}*/
static GLuint make_program(GLuint vertex_shader, GLuint fragment_shader) { GLint program_ok; GLuint program = glCreateProgram(); glAttachShader(program, vertex_shader); glAttachShader(program, fragment_shader); glLinkProgram(program); glGetProgramiv(program, GL_LINK_STATUS, &program_ok); if (!program_ok) { fprintf(stderr, "Failed to link shader program:\n"); show_info_log(program, glGetProgramiv, glGetProgramInfoLog); glDeleteProgram(program); return 0; } return program; }
Shader::Shader(Shader::Type t, char const* source) { this->id = glCreateShader(t); char const* source_ptr = source; GLint length = GLint(strlen(source)); glShaderSource(this->id, 1, reinterpret_cast<GLchar const**>(&source_ptr), &length); glCompileShader(this->id); GLint compile_ok = 0; glGetShaderiv(this->id, GL_COMPILE_STATUS, &compile_ok); if (!compile_ok) { show_info_log(this->id, glGetShaderiv, glGetShaderInfoLog); } }
static GLuint make_program(GLuint vertex_shader, GLuint fragment_shader)/*{{{*/ { /* Utility function to create a program object from two files*/ GLint program_ok; GLuint program = glCreateProgram(); // glAttachShader(program, vertex_shader); glAttachShader(program, fragment_shader); glLinkProgram(program); // glGetProgramiv(program, GL_LINK_STATUS, &program_ok); if (!program_ok) { std::cerr<<"Failed to link shader program:"<<std::endl; show_info_log(program, glGetProgramiv, glGetProgramInfoLog); glDeleteProgram(program); return 0; } else { // std::cout << "Vertex and fragment shaders linked" << std::endl; } return program; }/*}}}*/