GLuint LoadShader(const char* vertex_path, const char* fragment_path) { GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER); // Read shaders std::string vertShaderStr = readFile(vertex_path); std::string fragShaderStr = readFile(fragment_path); const char* vertShaderSrc = vertShaderStr.c_str(); const char* fragShaderSrc = fragShaderStr.c_str(); GLint result = GL_FALSE; int logLength; // Compile vertex shader glShaderSource(vertShader, 1, &vertShaderSrc, NULL); glCompileShader(vertShader); // Check vertex shader glGetShaderiv(vertShader, GL_COMPILE_STATUS, &result); glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logLength); // Handle error output std::vector<char> vertShaderError((logLength > 1) ? logLength : 1); glGetShaderInfoLog(vertShader, logLength, NULL, &vertShaderError[0]); std::cout << &vertShaderError[0] << std::endl; // Compile fragment shader std::cout << "Compiling fragment shader." << std::endl; glShaderSource(fragShader, 1, &fragShaderSrc, NULL); glCompileShader(fragShader); // Check fragment shader glGetShaderiv(fragShader, GL_COMPILE_STATUS, &result); glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logLength); //Handle error output std::vector<char> fragShaderError((logLength > 1) ? logLength : 1); glGetShaderInfoLog(fragShader, logLength, NULL, &fragShaderError[0]); std::cout << &fragShaderError[0] << std::endl; std::cout << "Linking program" << std::endl; GLuint program = glCreateProgram(); glAttachShader(program, vertShader); glAttachShader(program, fragShader); glLinkProgram(program); glGetProgramiv(program, GL_LINK_STATUS, &result); glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); std::vector<char> programError( (logLength > 1) ? logLength : 1 ); glGetProgramInfoLog(program, logLength, NULL, &programError[0]); std::cout << &programError[0] << std::endl; glDeleteShader(vertShader); glDeleteShader(fragShader); return program; }
GLuint Shader::LoadShader(const char* vertPath, const char* fragPath) { //generate shader names GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER); //get shader src string vertShaderStr = ReadFile(vertPath); string fragShaderStr = ReadFile(fragPath); const char* vertShaderSrc = vertShaderStr.c_str(); const char* fragShaderSrc = fragShaderStr.c_str(); GLint result = GL_FALSE; int logLength; //compile vertex shader glShaderSource(vertShader, 1, &vertShaderSrc, NULL); glCompileShader(vertShader); glGetShaderiv(vertShader, GL_COMPILE_STATUS, &result); glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logLength); vector<char> vertShaderError(logLength); glGetShaderInfoLog(vertShader, logLength, NULL, &vertShaderError[0]); cout << &vertShaderError[0] << endl; //compile fragment shader glShaderSource(fragShader, 1, &fragShaderSrc, NULL); glCompileShader(fragShader); glGetShaderiv(fragShader, GL_COMPILE_STATUS, &result); glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logLength); vector<char> fragShaderError(logLength); glGetShaderInfoLog(fragShader, logLength, NULL, &fragShaderError[0]); cout << &fragShaderError[0] << endl; //link the program GLuint program = glCreateProgram(); glAttachShader(program, vertShader); glAttachShader(program, fragShader); glLinkProgram(program); glGetProgramiv(program, GL_LINK_STATUS, &result); glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); vector<char> programError(logLength > 1 ? logLength : 1); glGetProgramInfoLog(program, logLength, NULL, &programError[0]); cout << &programError[0] << endl; glDeleteShader(vertShader); glDeleteShader(fragShader); return program; }
// load shaders bool ShaderLoader::loadShader(const char *vertex_path, const char *fragment_path, GLuint &program) { // create shaders GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER); // read shaders std::string vertShaderStr = readFile(vertex_path); std::string fragShaderStr = readFile(fragment_path); const char *vertShaderSrc = vertShaderStr.c_str(); const char *fragShaderSrc = fragShaderStr.c_str(); // hold results GLint result = GL_FALSE; int logLength; // compile vertex shader glShaderSource(vertShader, 1, &vertShaderSrc, NULL); glCompileShader(vertShader); // check vertex shader glGetShaderiv(vertShader, GL_COMPILE_STATUS, &result); // failed compile if(!result) { glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logLength); std::vector<char> vertShaderError((logLength > 1) ? logLength : 1); glGetShaderInfoLog(vertShader, logLength, NULL, &vertShaderError[0]); std::cerr << "[F] FAILED TO COMPILE VERTEX SHADER!" << &vertShaderError[0] << std::endl; return false; } // compile fragment shader glShaderSource(fragShader, 1, &fragShaderSrc, NULL); glCompileShader(fragShader); // check fragment shader glGetShaderiv(fragShader, GL_COMPILE_STATUS, &result); // failed compile if(!result) { glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logLength); std::vector<char> fragShaderError((logLength > 1) ? logLength : 1); glGetShaderInfoLog(fragShader, logLength, NULL, &fragShaderError[0]); std::cerr << "[F] FAILED TO COMPILE FRAGMENT SHADER!" << &fragShaderError[0] << std::endl; return false; } // create program and link with shaders program = glCreateProgram(); glAttachShader(program, vertShader); glAttachShader(program, fragShader); glLinkProgram(program); // check program status glGetProgramiv(program, GL_LINK_STATUS, &result); // failed program if(!result) { glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); std::vector<char> programError( (logLength > 1) ? logLength : 1 ); glGetProgramInfoLog(program, logLength, NULL, &programError[0]); std::cerr << "[F] THE SHADER PROGRAM FAILED TO LINK" << &programError[0] << std::endl; return false; } // delete shaders after attachment glDeleteShader(vertShader); glDeleteShader(fragShader); // return program with shaders return true; }