|   | 231 |  | 
                  
                          |   | 232 | == Exercises #2 == | 
                  
                          |   | 233 |  1. To be able to continue and not get lost introduce shader compiler logs in case of compilation errors by adding the following code into {{{setShaders()}} right at after vertex shader compilation: | 
                  
                          |   | 234 |    {{{ | 
                  
                          |   | 235 |    #!c | 
                  
                          |   | 236 |     GLint compiled; | 
                  
                          |   | 237 |     glGetShaderiv(v, GL_COMPILE_STATUS, &compiled ); | 
                  
                          |   | 238 |     if ( !compiled ) { | 
                  
                          |   | 239 |       GLsizei len; | 
                  
                          |   | 240 |       glGetShaderiv( v, GL_INFO_LOG_LENGTH, &len ); | 
                  
                          |   | 241 |       GLchar* log = malloc(sizeof(GLchar)*(len+1)); | 
                  
                          |   | 242 |       printf("Shader compilation failed: %s\n", log); | 
                  
                          |   | 243 |       free(log); | 
                  
                          |   | 244 |     } | 
                  
                          |   | 245 |    }}} | 
                  
                          |   | 246 |  Do not forget to repeat the same thing for fragment shader. | 
                  
                          |   | 247 |  2. Add linker debugging | 
                  
                          |   | 248 |    {{{ | 
                  
                          |   | 249 |    #!c   | 
                  
                          |   | 250 |     GLint linked; | 
                  
                          |   | 251 |     glGetProgramiv(p, GL_LINK_STATUS, &linked ); | 
                  
                          |   | 252 |     if ( !linked ) { | 
                  
                          |   | 253 |       GLsizei len; | 
                  
                          |   | 254 |       glGetProgramiv( p, GL_INFO_LOG_LENGTH, &len ); | 
                  
                          |   | 255 |       GLchar* log = malloc(sizeof(GLchar)*(len+1)); | 
                  
                          |   | 256 |       glGetProgramInfoLog( p, len, &len, log ); | 
                  
                          |   | 257 |       printf("Shader linking failed: %s\n", log); | 
                  
                          |   | 258 |       free(log); | 
                  
                          |   | 259 |     } | 
                  
                          |   | 260 |    }}} | 
                  
                          |   | 261 |   3. For general (core) OpenGL errors we can use the following utility at suspicious places. | 
                  
                          |   | 262 |   {{{ | 
                  
                          |   | 263 |   #!c | 
                  
                          |   | 264 |      GLenum errCode; | 
                  
                          |   | 265 |      if ((errCode = glGetError()) != GL_NO_ERROR) { | 
                  
                          |   | 266 |         const GLubyte *errString = gluErrorString(errCode); | 
                  
                          |   | 267 |         fprintf (stderr, "OpenGL Error: %s\n", errString); | 
                  
                          |   | 268 |      } | 
                  
                          |   | 269 |   }}} |