bool GLWrapper::createAndCompileShader(const std::string & shaderSource, GLenum shaderType, GLuint & handle, std::ostream & shaderErrorOutput) { const GLchar * shaderSourcePointer = shaderSource.c_str(); handle = GLLOG(glCreateShader(shaderType));ERROR_CHECK; GLLOG(glShaderSource(handle, 1, &shaderSourcePointer, NULL));ERROR_CHECK; GLLOG(glCompileShader(handle));ERROR_CHECK; GLint compileStatus(0); GLLOG(glGetShaderiv(handle, GL_COMPILE_STATUS, &compileStatus));ERROR_CHECK; GLint bufferSize(0); GLLOG(glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &bufferSize));ERROR_CHECK; GLchar* infoLog = new GLchar[bufferSize+1]; GLsizei infoLogLength; GLLOG(glGetShaderInfoLog(handle, bufferSize, &infoLogLength, infoLog));ERROR_CHECK; infoLog[bufferSize] = '\0'; shaderErrorOutput << infoLog; delete[] infoLog; if (!compileStatus) { GLLOG(glDeleteShader(handle));ERROR_CHECK; handle = 0; return false; } else return true; }
bool compileShader(GLuint handle, GLenum stype, const char* src) { int shader_len = strlen(src); glShaderSource(handle, 1, &src, &shader_len); glCompileShader(handle); if (!compileStatus(handle)) { char buff[2048]; int nwritten; glGetShaderInfoLog(handle, 2048, &nwritten, buff); const char* typelabel = stype == GL_VERTEX_SHADER ? "vertex" : (stype == GL_FRAGMENT_SHADER ? "fragment" : "unknown"); printf("Error in %s shader\n%s\n", typelabel, buff); return false; } return true; }