3.3.3 La méthode creerRenderBuffer()

Maintenant que nous avons un squelette de classe défini, nous allons pouvoir passer à la troisième tâche que nous attend sur la liste : la création des Render Buffers.

Comme je vous l'ai dit tout à l'heure, les Render Buffers ne seront pas codés dans une classe dédiée, ils ne sont pas aussi importants que les textures donc ils n'ont pas besoin d'être séparés du reste. Nous les utiliserons pour gérer le Depth et le Stencil Buffer qui, contrairement au Color, ne sont pas représentables par des textures (souvenez-vous du petit schéma dans l'introduction).

Pour les créer, nous allons implémenter une méthode qui se chargera de générer et de configurer un Render Buffer à partir d'un identifiant OpenGL. De cette façon, nous initialiserons un buffer très simplement en utilisant seulement une lignes de code.

La méthode en question s'appellera creerRenderBuffer() et prendra 2 paramètres :

1
void creerRenderBuffer(GLuint &id, GLenum formatInterne);
  • id : L'identifiant qui représentera le Render Buffer
  • formatInterne : Format interne du buffer. C'est un paramètre que l'on voit plus souvent avec les textures, nous verrons pourquoi nous l'utilisons ici aussi

Génération de l'identifiant

L'avantage des Render Buffers c'est que ce sont des objets OpenGL, ils se gèrent donc de la même façon que les VBO, les VAO et les textures. C'est-à-dire qu'ils ont besoin d'un identifiant et d'un verrouillage pour leur configuration (et à fortiori pour leur utilisation). Nous retrouverons ainsi, une fois de plus, toutes les fonctions du type glGenXXX(), glBindXXX() etc.

Je vais passer rapidement sur ces deux notions que nous avons l'habitude de voir maintenant. La première est la génération d'identifiant, elle se fait ici avec la fonction glGenRenderbuffers() :

1
void glGenRenderbuffers(GLsizei number, GLuint *renderbuffers);
  • number : Le nombre d'ID à initialiser. Nous lui donnerons toujours la valeur 1
  • renderbuffers : Un tableau de type GLuint ou l'adresse d'une variable de même type représentant le ou les Render Buffer

Nous appellerons cette fonction en donnant en paramètre la valeur 1 ainsi que l'adresse de la variable id (qui est elle-même un paramètre de la méthode creerRenderBuffer()) :

1
2
3
4
void FrameBuffer::creerRenderBuffer(GLuint &id, GLenum formatInterne){
	// Génération de l'identifiant
	glGenRenderbuffers(1, &id);
}

On profite de cette génération pour inclure la vérification d'un "précédent chargement" qui s'applique à tous les objets OpenGL, et donc aux Render Buffers, afin d'éviter d'éventuelles fuites de mémoire. Nous utiliserons pour cela la fonction glIsRenderbuffer() :

1
GLboolean glIsRenderbuffer(GLuint renderbuffer);

La fonction renvoie la valeur GL_FALSE si aucun chargement n'a été effectué sur l'objet donné ou GL_TRUE si c'est le cas.

Si nous tombons sur la première valeur, nous n'aurons rien à faire. En revanche, si la fonction nous renvoie GL_TRUE il faudra faire attention à détruire le Render Buffer avant de le charger à nouveau. La fonction permettant cette destruction s'appelle glDeleteRenderbuffers() :

1
void glDeleteRenderbuffers(GLsizei number, GLuint *renderbuffers);

Elle prend exactement les mêmes paramètres que glGenRenderbuffers(), à savoir :

  • number : Le nombre d'ID à détruire
  • renderbuffers : Un tableau de type GLuint ou l'adresse d'une variable de même type contenant le ou les objet(s) à détruire

Comme à l'accoutumé, nous appellerons les deux fonctions que nous venons de voir juste avant la génération d'ID :

1
2
3
4
5
6
7
void FrameBuffer::creerRenderBuffer(GLuint &id, GLenum formatInterne){
	// Destruction d'un éventuel ancien Render Buffer
	if(glIsRenderbuffer(id) == GL_TRUE) glDeleteRenderbuffers(1, &id);

	// Génération de l'identifiant
	glGenRenderbuffers(1, &id);
}