10.5 Lier son programme GPU aux shaders

Pour lier notre programme GPU aux shaders qui lui sont attachés, il nous suffit d'avoir l'identifiant du programme, nous allons donc avoir une fonction qui ressemble à ça :

1
int linkGlProgram(GLuint programID);

Où :

  • programID : est l'identifiant du programme que l'on veut lier
  • la fonction retourne 1 si le lien a réussit, 0 si le lien à échoué (rappelez vous que l'on est en C, donc le bool n'existe pas, comme la cuillère)

Voici la fonction en entier :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int linkGlProgram(GLuint programID){
	glLinkProgram(programID);
	GLint linkingResult = GL_TRUE;
	glGetProgramiv(programID, GL_COMPILE_STATUS, &linkingResult);
	if(linkingResult != GL_TRUE){                              /* erreur a la compilation récupération du log d'erreur */
		char *log = NULL;
		GLint logsize;
		glGetShaderiv(programID, GL_INFO_LOG_LENGTH, &logsize);  /* on récupéré la taille du message d'erreur */
		log = malloc(logsize + 1);                     /* on alloue un espace mémoire dans lequel OpenGL écrira le message */
		if(log == NULL){
			fprintf(stderr, "impossible d'allouer de la mémoire !\n");
			return 0;
		}
		memset(log, '\0', logsize + 1);     /* initialisation du contenu */
		
		glGetProgramInfoLog(programID, logsize, &logsize, log);
		fprintf(stderr, "impossible linker le programme :\n%s", log);
		free(log); /* ne pas oublier de libérer la mémoire et notre shader */
		return 0;
	}else return 1;
}

Comme tout à l'heure je ne vais pas vous la détailler car il y a suffisamment de commentaires pour cela.

Ce qui veut dire que maintenant notre petit bout de code pour initialiser un programme GPU est fini :

1
2
3
4
5
6
7
8
9
10
11
12
GLuint programTest = glCreateProgram();
GLuint fragmentShader = loadShader(GL_FRAGMENT_SHADER, "../Shaders/couleurs.frag");
GLuint vertexShader = loadShader(GL_VERTEX_SHADER, "../Shaders/couleurs.vert");

//on attache les shaders au programme
glAttachShader(programTest, fragmentShader);
glAttachShader(programTest, vertexShader);

int linkingResult = linkGlProgram(programTest);
if(linkingResult == 0){      //on râle que ça a foiré, enfin en fait quelque chose 
	glDeleteProgram(p_programTest);
}

Et voilà, surtout ne vous précipitez pas à faire un programme tout de suite, on a pas encore tout à fait fini. Mais on y est presque.