// // defaultShader constructor // // This constructor actually compiles and links the GLSL shader, // so it must be called with a current context active. //////////////////////////////////////////////////////////////////////////////// defaultShader::defaultShader() : m_program(0), m_fShader(0), m_vShader(0) { if (glShadingLanguageSupport) { m_program = glCreateProgramObject(); m_vShader = glCreateShaderObject( GL_VERTEX_SHADER); m_fShader = glCreateShaderObject( GL_FRAGMENT_SHADER); glAttachObject( m_program, m_vShader); glAttachObject( m_program, m_fShader); const char *temp = vShader; glShaderSource( m_vShader, 1, &temp, NULL); temp = fShader; glShaderSource( m_fShader, 1, &temp, NULL); GLint success; glCompileShader( m_vShader); glGetObjectParameteriv( m_vShader, GL_COMPILE_STATUS, &success); if (! success) { //figure out why we didn't compile char log[256]; //printf("Failed to compile vertex shader\n"); glGetInfoLog( m_vShader, 256, NULL, log); //printf(" Infolog: %s\n", log); } glCompileShader( m_fShader); glGetObjectParameteriv( m_fShader, GL_COMPILE_STATUS, &success); if (! success) { //figure out why we didn't compile char log[256]; //printf("Failed to compile fragment shader\n"); glGetInfoLog( m_fShader, 256, NULL, log); //printf(" Infolog: %s\n", log); } glLinkProgram( m_program); glGetObjectParameteriv( m_program, GL_LINK_STATUS, &success); if (! success) { //figure out why we didn't link char log[256]; //printf("Failed to link\n"); glGetInfoLog( m_program, 256, NULL, log); //printf(" Infolog: %s\n", log); } } }
void printLog(GLuint handle, bool is_program) { //Why write two log printing functions when you can use FUNCTION POINTERS AND TERNARY OPERATORS >:D GLboolean (*glIs)(GLuint) = is_program? glIsProgram : glIsShader; void (*glGetiv)(GLuint, GLenum, GLint *) = is_program? glGetProgramiv : glGetShaderiv; void (*glGetInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *) = is_program? glGetProgramInfoLog : glGetShaderInfoLog; if (glIs(handle)) { int log_length = 0; int max_length = log_length; glGetiv(handle, GL_INFO_LOG_LENGTH, &max_length); char *info_log = (char *)malloc(max_length); glGetInfoLog(handle, max_length, &log_length, info_log); if (log_length > 0) { printf("%s\n", info_log); } free(info_log); } else { printf("Name %d is not a %s.\n", handle, is_program?"program":"shader"); } }