3.4.2 La génération d'identifiant

Allez, on se met dans le bain directement et on commence à coder notre nouvelle méthode dès maintenant. Le début sera très similaire à ce que nous avons fait jusqu'à présent car les Frame Buffers sont eux-aussi des objets OpenGL (et oui encore). On retrouvera donc une fois de plus la génération d'identifiant, la vérification de double chargement et le verrouillage.

La première de ces opérations sera assurée par la fonction glGenFrambuffers() :

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

Le verrouillage quant à lui, sera effectué par la fonction glBindFramebuffer() :

1
void glBindFramebuffer(GLenum target, GLuint framebuffer);
  • target : Type d'objet à verrouiller, ici nous lui donnerons toujours la valeur GL_FRAME_BUFFER
  • framebuffer : Identifiant représentant le FBO

Nous utiliserons ces deux fonctions au début de la méthode charger(). L'identifiant à donner sera évidemment l'attribut m_id de notre classe FrameBuffer :

1
2
3
4
5
6
7
8
9
10
bool FrameBuffer::charger(){
	// Génération d'un id
	glGenFramebuffers(1, &m_id);

	// Verrouillage du Frame Buffer
	glBindFramebuffer(GL_FRAMEBUFFER, m_id);

	// Déverrouillage du Frame Buffer
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

Remarquez le dernier appel qui permet de déverrouiller le FBO.

Comme d'habitude, on en profite au passage pour inclure le code qui permet d'éviter le double chargement. Nous utiliserons pour cela les fonctions glIsFramebuffer() et glDeleteFramebuffers() :

1
2
GLboolean glIsFramebuffer(GLuint framebuffer);
void glDeleteFramebuffers(GLsizei number, GLuint *framebuffers);
  • La première renverra la valeur GL_FALSE si aucun chargement n'a été effectué ou GL_TRUE si c'est le cas.
  • La seconde prendra les mêmes paramètres que la fonction de génération d'ID.

Nous appellerons ces fonctions avec un bloc if de la même façon que d'habitude. Je vous conseille cependant de mettre des accolades à votre bloc car nous rajouterons une instruction dans très peu de temps.

1
2
// Vérification d'un éventuel ancien FBO
if(glIsFramebuffer(m_id) == GL_TRUE) glDeleteFramebuffers(1, &m_id);

Si on ajoute ceci au code que nous avions déjà :

1
2
3
4
5
6
7
8
9
10
11
12
13
bool FrameBuffer::charger(){
	// Vérification d'un éventuel ancien FBO
	if(glIsFramebuffer(m_id) == GL_TRUE) glDeleteFramebuffers(1, &m_id);

	// Génération d'un id
	glGenFramebuffers(1, &m_id);

	// Verrouillage du Frame Buffer
	glBindFramebuffer(GL_FRAMEBUFFER, m_id);

	// Déverrouillage du Frame Buffer
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
}