GLuint Shader_Loader::CreateShader(GLenum shaderType, std::string source, char* shaderName){ int compile_result = 0; GLuint shader = glCreateShader(shaderType); const char *shader_code_ptr = source.c_str(); const int shader_code_size = source.size(); glShaderSource(shader, 1, &shader_code_ptr, &shader_code_size); glCompileShader(shader); glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_result); //check for errors if (compile_result == GL_FALSE){ int info_log_length = 0; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_length); std::vector<char> shader_log(info_log_length); glGetShaderInfoLog(shader, info_log_length, NULL, &shader_log[0]); std::cout << "ERROR compiling shader: " << shaderName << std::endl << &shader_log[0] << std::endl; return 0; } return shader; }
//creaza un obiect de tip shader unsigned int _createShader(const std::string &shader_file, GLenum shader_type){ //incarca fisierul intr-un string std::string shader_code; std::ifstream file(shader_file.c_str(), std::ios::in); if(!file.good()){ std::cout<<"Shader Loader: Nu am gasit fisierul shader "<<shader_file<<" sau nu am drepturile sa il deschid!"<<std::endl; std::terminate(); } file.seekg(0, std::ios::end); shader_code.resize((unsigned int)file.tellg()); file.seekg(0, std::ios::beg); file.read(&shader_code[0], shader_code.size()); file.close(); int info_log_length=0,compile_result=0; unsigned int gl_shader_object; //construieste un obiect de tip shader din codul incarcat gl_shader_object = glCreateShader(shader_type); const char *shader_code_ptr = shader_code.c_str(); const int shader_code_size = shader_code.size(); glShaderSource(gl_shader_object,1,&shader_code_ptr,&shader_code_size); glCompileShader(gl_shader_object); glGetShaderiv(gl_shader_object, GL_COMPILE_STATUS, &compile_result); //daca exista erori output la consola if(compile_result == GL_FALSE){ std::string str_shader_type=""; if(shader_type == GL_VERTEX_SHADER) str_shader_type="vertex shader"; if(shader_type == GL_TESS_CONTROL_SHADER) str_shader_type="tess control shader"; if(shader_type == GL_TESS_EVALUATION_SHADER) str_shader_type="tess evaluation shader"; if(shader_type == GL_GEOMETRY_SHADER) str_shader_type="geometry shader"; if(shader_type == GL_FRAGMENT_SHADER) str_shader_type="fragment shader"; if(shader_type == GL_COMPUTE_SHADER) str_shader_type="compute shader"; glGetShaderiv(gl_shader_object, GL_INFO_LOG_LENGTH, &info_log_length); std::vector<char> shader_log(info_log_length); glGetShaderInfoLog(gl_shader_object, info_log_length, NULL, &shader_log[0]); std::cout<<"Shader Loader: EROARE DE COMPILARE pentru "<<str_shader_type<<std::endl<<&shader_log[0]<<std::endl; return 0; } return gl_shader_object; }
/** * Compiles and links a new shader program. * * @param s The shader struct to store into. * @param vert_src Vertex shader source. * @param frag_src Fragment shader source. */ int shader_init(struct shader *s, char *vert_src, int vert_src_len, char *frag_src, int frag_src_len) { int ret = 0; /* Make sure struct is up-to-date. */ s->vert_src = vert_src; s->vert_src_len = vert_src_len; s->frag_src = frag_src; s->frag_src_len = frag_src_len; /* FIXME: make sure string ends with \0. */ vert_src[vert_src_len-1] = '\0'; frag_src[frag_src_len-1] = '\0'; /* Compile vertex shader. */ GLuint vs = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vs, 1, &vert_src, NULL); glCompileShader(vs); ret = shader_log(vs, "vertex shader"); if(ret != SHADER_OK) { return ret; } /* Compile fragment shader. */ GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fs, 1, &frag_src, NULL); glCompileShader(fs); ret = shader_log(fs, "fragment shader"); if(ret != SHADER_OK) { return ret; } /* Compile shader. */ s->program = glCreateProgram(); glAttachShader(s->program, fs); glAttachShader(s->program, vs); glLinkProgram(s->program); glDeleteShader(vs); glDeleteShader(fs); ret = shader_program_log(s->program, "program"); if(ret != SHADER_OK) { return ret; } /* Position stream. */ GLint posAttrib = glGetAttribLocation(s->program, ATTRIB_NAME_POSITION); shader_debug("attrib: %s=%d\n", ATTRIB_NAME_POSITION, posAttrib); glEnableVertexAttribArray(posAttrib); glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0); /* Texcoord stream. */ GLint texcoordAttrib = glGetAttribLocation(s->program, ATTRIB_NAME_TEXCOORD); shader_debug("attrib: %s=%d\n", ATTRIB_NAME_TEXCOORD, texcoordAttrib); glEnableVertexAttribArray(texcoordAttrib); glVertexAttribPointer(texcoordAttrib, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*) (3 * sizeof(float))); return SHADER_OK; }