// /// /// \brief Load a vertex and fragment shader, create a program object, link program. // Errors output to log. /// \param vertShaderSrc Vertex shader source code /// \param fragShaderSrc Fragment shader source code /// \return A new program object linked with the vertex/fragment shader pair, 0 on failure // GLuint esLoadProgram ( const char *vertShaderSrc, const char *fragShaderSrc ) { GLuint vertexShader; GLuint fragmentShader; GLuint programObject; GLint linked; // Load the vertex/fragment shaders vertexShader = esLoadShader ( GL_VERTEX_SHADER, vertShaderSrc ); if ( vertexShader == 0 ) return 0; fragmentShader = esLoadShader ( GL_FRAGMENT_SHADER, fragShaderSrc ); if ( fragmentShader == 0 ) { glDeleteShader( vertexShader ); return 0; } // Create the program object programObject = glCreateProgram ( ); if ( programObject == 0 ) return 0; glAttachShader ( programObject, vertexShader ); glAttachShader ( programObject, fragmentShader ); // Link the program glLinkProgram ( programObject ); // Check the link status glGetProgramiv ( programObject, GL_LINK_STATUS, &linked ); if ( !linked ) { GLint infoLen = 0; glGetProgramiv ( programObject, GL_INFO_LOG_LENGTH, &infoLen ); if ( infoLen > 1 ) { char* infoLog = malloc (sizeof(char) * infoLen ); glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog ); glutLogMessage ( "Error linking program:\n%s\n", infoLog ); free ( infoLog ); } glDeleteProgram ( programObject ); return 0; } // Free up no longer needed shader resources glDeleteShader ( vertexShader ); glDeleteShader ( fragmentShader ); return programObject; }
int Shaders::Init(char * fileVertexShader, char * fileFragmentShader) { vertexShader = esLoadShader(GL_VERTEX_SHADER, fileVertexShader); if ( vertexShader == 0 ) return -1; fragmentShader = esLoadShader(GL_FRAGMENT_SHADER, fileFragmentShader); if ( fragmentShader == 0 ) { glDeleteShader( vertexShader ); return -2; } program = esLoadProgram(vertexShader, fragmentShader); //finding location of uniforms / attributes positionAttribute = glGetAttribLocation(program, "a_posL"); colorAttribute = glGetAttribLocation(program, "a_color"); matrixTransform = glGetUniformLocation(program, "u_matT"); uv = glGetAttribLocation(program, "a_uv"); textureUniform = glGetUniformLocation(program, "s_texture"); return 0; }
GLuint ESUTIL_API esLoadProgram ( const char *vertShaderSrc, const char *fragShaderSrc ) { GLuint vertexShader; GLuint fragmentShader; GLuint programObject; GLint linked; vertexShader = esLoadShader ( GL_VERTEX_SHADER, vertShaderSrc ); if ( vertexShader == 0 ) return 0; fragmentShader = esLoadShader ( GL_FRAGMENT_SHADER, fragShaderSrc ); if ( fragmentShader == 0 ) { glDeleteShader( vertexShader ); return 0; } programObject = glCreateProgram ( ); if ( programObject == 0 ) return 0; glAttachShader ( programObject, vertexShader ); glAttachShader ( programObject, fragmentShader ); glLinkProgram ( programObject ); glGetProgramiv ( programObject, GL_LINK_STATUS, &linked ); if ( !linked ) { GLint infoLen = 0; glGetProgramiv ( programObject, GL_INFO_LOG_LENGTH, &infoLen ); if ( infoLen > 1 ) { char* infoLog =new char[infoLen]; glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog ); esLogMessage ( "Error linking program:\n%s\n", infoLog ); delete[] infoLog; } glDeleteProgram ( programObject ); return 0; } glDeleteShader ( vertexShader ); glDeleteShader ( fragmentShader ); return programObject; }
GLuint esCreateProgram(std::string vertexSource, std::string fragmentSource) { GLuint vertexShader; GLuint fragmentShader; GLuint programObject; GLint linked; // Load the vertex/fragment shaders vertexShader = esLoadShader(GL_VERTEX_SHADER, vertexSource); if (vertexShader == 0) return 0; fragmentShader = esLoadShader(GL_FRAGMENT_SHADER, fragmentSource); if (fragmentShader == 0) { glDeleteShader(vertexShader); return 0; } // Create the program object programObject = glCreateProgram(); if (programObject == 0) return 0; glAttachShader(programObject, vertexShader); glAttachShader(programObject, fragmentShader); // Link the program glLinkProgram(programObject); // Check the link status glGetProgramiv(programObject, GL_LINK_STATUS, &linked); if (!linked) { GLint infoLen = 0; glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &infoLen); if (infoLen > 1) { char* infoLog = (char *) malloc(sizeof(char) * infoLen); glGetProgramInfoLog(programObject, infoLen, NULL, infoLog); checkGLError(infoLog); free(infoLog); } glDeleteProgram(programObject); return 0; } // Free up no longer needed shader resources glDeleteShader(vertexShader); glDeleteShader(fragmentShader); return programObject; }
GLuint ESUTIL_API esLoadShaderFromFile ( GLenum type, const char *filename) { GLuint shader; FILE *fp = fopen(filename, "rb"); if (fp == NULL) return 0; char c; int len = 0; while (feof(fp) == 0) { fread(&c, sizeof(char), 1, fp); len++; } rewind(fp); char *str = new char[len]; fread(str, sizeof(char), len-1, fp); str[len-1] = '\0'; const char *source = (const char*)str; shader = esLoadShader(type, source); delete[] str; fclose(fp); return shader; }