void createProgram(GLuint progID, std::vector<const char*> layoutLocations) { for(int i = 0; i < layoutLocations.size(); i++) { if (layoutLocations[i] != "") glBindAttribLocation(progID, i, layoutLocations[i]); } try { glLinkProgram(progID); GLint compileResult = 0; int compileLogLength = 0; glGetShaderiv(progID, GL_LINK_STATUS, &compileResult); glGetShaderiv(progID, GL_INFO_LOG_LENGTH, &compileLogLength); std::vector<char> compileLog(compileLogLength); glGetShaderInfoLog(progID, compileLogLength, NULL, &compileLog[0]); if (compileLog.size() > 1) Logger() << compileLog.data() <<std::endl; std::vector<char>().swap(compileLog); } catch (std::bad_alloc bad) { std::cerr<<"Bad allocation from compileLog."<<std::endl; } }
void loadShaderPart(GLuint partID, char * path) { std::string shaderCode; std::ifstream stream(path, std::ios::in); if(stream.is_open()) { std::string line; while(std::getline(stream, line)) shaderCode += "\n" + line; //HERERERERE is an error stream.close(); } GLint compileResult = GL_FALSE; int compileLogLength; const char * codePointer = shaderCode.c_str(); glShaderSource(partID, 1, &codePointer, NULL); glCompileShader(partID); glGetShaderiv(partID, GL_COMPILE_STATUS, &compileResult); glGetShaderiv(partID, GL_INFO_LOG_LENGTH, &compileLogLength); std::vector<char> compileLog(compileLogLength); glGetShaderInfoLog(partID, compileLogLength, NULL, &compileLog[0]); if (compileLog.size() > 1) Logger() << compileLog.data() << std::endl; std::vector<char>().swap(compileLog); }
void ShaderErrorHandler(GLuint shader_id) { GLint log_size; glGetShaderiv(shader_id, GL_INFO_LOG_LENGTH, &log_size); log_size = log_size > 0 ? log_size : 1024; std::vector<char> compileLog(log_size); glGetShaderInfoLog(shader_id, log_size, nullptr, compileLog.data()); std::cerr << "Compile Error: " << shader_id << " " << compileLog.data() << std::endl; }
void Program::create(VShader& vs, FShader& fs) { auto program = glCreateProgram(); // attach both shaders glAttachShader(program, vs.getHandle()); glAttachShader(program, fs.getHandle()); // link program glLinkProgram(program); // check for errors GLint linkStatus; glGetProgramiv(program, GL_LINK_STATUS, &linkStatus); if(linkStatus != GL_TRUE) { // obtain error message GLint logLength; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); vector<char> compileLog(logLength); glGetShaderInfoLog(program, logLength, nullptr, compileLog.data()); logError("[Program] Could not link shaders <", vs.getFilename(), ", ", fs.getFilename(), "> ->"); logError("[Program] ", compileLog.data()); throw GLException("Could not link shaders"); } log("[Program] Shaders <", vs.getFilename(), ", ", fs.getFilename(), "> were successfully linked."); // detach shaders (TODO: is this a good idea?) glDetachShader(program, vs.getHandle()); glDetachShader(program, fs.getHandle()); // check for any error checkGLError("[Program] GL error while linking program <", GLERR, ">!"); // linking was successful: commit changes m_handle = program; }