In my program I have a function to compile shaders which creates each shader index variable locally to be binded to the program object which it returns like so:
(simplified):
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
// compile each shader
programObject = glCreateProgram();
glAttachShader(programObject, vertexShader);
glAttachShader(programObject, fragmentShader);
glLinkProgram(programObject);
glGetProgramiv(programObject, GL_LINK_STATUS, &linked);
if(!linked) return 0;
return programObject;
So that I can then do:
(simplified):
int menuShader = 0;
short initMenu(void) {
menuShader = compileShaders(...);
}
void renderMenu(void) {
glUseProgram(menuShader);
// render
glUseProgram(0);
}
Now to deinit the menu, is calling:
glDeleteProgram(1, menuShader);
Enough? Will it free my vertex and fragment shaders as well or just free the program object? If not, does that mean that I have to make vertexShader and fragmentShader global variables so that I can free them as well in the deinit routine?