bool Shader::compile() { assert(mId > 0 && "id is null so the shader source should be loaded first!"); glCompileShader(mId); // check: int compileStatus = GL_TRUE; glGetShaderiv(mId, GL_COMPILE_STATUS, &compileStatus); if (compileStatus == GL_FALSE) { LOG_ERROR("Compilation for %s shader failed!", mName.c_str()); logShaderInfo(); return false; } return true; }
GLuint createProgram(const GLchar* vertexShaderSource[], const GLchar* fragmentShaderSource[]) { // Generate program (empty here, will add shaders to it below) GLuint programId = glCreateProgram(); // Create vertex shader GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); // Shaders are written in a C-like language called GLSL. Read more at: http://www.raywenderlich.com/3664/opengl-tutorial-for-ios-opengl-es-2-0 // Set vertex source glShaderSource( vertexShader, 1, vertexShaderSource, NULL ); // Compile vertex source glCompileShader( vertexShader ); // Check vertex shader for errors GLint vShaderCompiled = GL_FALSE; glGetShaderiv( vertexShader, GL_COMPILE_STATUS, &vShaderCompiled ); if( vShaderCompiled != GL_TRUE ) { printf( "Failed to compile vertex shader %d!\n", vertexShader ); logShaderInfo( vertexShader ); return -1; } // Attach vertex shader to program glAttachShader( programId, vertexShader ); // Create fragment shader GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER ); // Set fragment source glShaderSource( fragmentShader, 1, fragmentShaderSource, NULL ); // Compile fragment source glCompileShader( fragmentShader ); // Check fragment shader for errors GLint fShaderCompiled = GL_FALSE; glGetShaderiv( fragmentShader, GL_COMPILE_STATUS, &fShaderCompiled ); if( fShaderCompiled != GL_TRUE ) { printf( "Failed to compile fragment shader %d!\n", fragmentShader ); logShaderInfo( fragmentShader ); return -1; } // Attach fragment shader to program glAttachShader(programId, fragmentShader); // Link program glLinkProgram( programId ); // Check for errors GLint programSuccess = GL_TRUE; glGetProgramiv(programId, GL_LINK_STATUS, &programSuccess); if( programSuccess != GL_TRUE ) { printf( "Error linking program %d!\n", programId ); logProgramInfo( programId ); return -1; } return programId; }