3.3.4 Configuration

Maintenant que nous avons un Render Buffer généré, il ne nous reste plus qu'à le configurer. Cette étape commence évidemment par le "verrouillage" de façon à ce qu'OpenGL sache sur quel objet il doit travailler. Nous utiliserons pour cela la fonction glBindRenderbuffer() :

1
void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
  • target : Le fameux paramètre target qui correspond toujours au type de l'objet que l'on veut verrouiller. Dans notre cas, nous lui donnerons la constante GL_RENDERBUFFER
  • renderbuffer : Identifiant représentant le Render Buffer

Nous appellerons cette fonction deux fois : une fois pour le verrouillage et une autre pour le déverrouillage. Le premier appel prendra en paramètre l'identifiant à verrouiller tandis que le second prendra la valeur 0 :

1
2
3
4
5
6
7
8
9
10
11
12
13
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);

	// Verrouillage
	glBindRenderbuffer(GL_RENDERBUFFER, id);

	// Déverrouillage
	glBindRenderbuffer(GL_RENDERBUFFER, 0);
}

Le Render Buffer est à présent verrouillé et prêt à être configuré. Cette opération va d'ailleurs être beaucoup plus simple que celle des autres objets OpenGL car nous n'avons besoin ici que d'une seule et unique fonction.

La fonction en question peut d'ailleurs nous faire penser à glTexImage2D() car elle permet de définir le format et les dimensions du Render Buffer. Elle possède cependant moins de paramètres qu'elle, ce qui la rend tout de même plus agréable à utiliser.

Cette fameuse fonction s'appelle glRenderbufferStorage() :

1
void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
  • target : Type de l'objet que l'on veut verrouiller, donc GL_RENDERBUFFER ici
  • internalformat : Format interne du buffer, nous allons faire un petit aparté dessus dans un instant
  • width : largeur du buffer
  • height : hauteur du buffer

Vous vous souvenez du paramètre formatInterne dont je vous parlé tout à l'heure ? Celui de la méthode creerRenderBuffer() ? Et bien c'est ici que nous allons l'utiliser.

Ce dernier permet de définir le "type" de donnée à stocker dans le buffer. Par exemple, les données relatives à la profondeur (Depth) ne sont pas du tout les mêmes que celles relatives aux pochoirs (Stencil), et pourtant ce sont tous les deux des Render Buffers. Pour marquer cette différence, il faut indiquer dès maintenant le type de donnée qu’accueillera le buffer.

Pour cela, nous allons donner le paramètre formatInterne à la fonction glRenderbufferStorage(). Nous lui donnerons également les dimensions du FBO à l'aide des attributs m_largeur et m_hauteur :

1
2
// Configuration du Render Buffer
glRenderbufferStorage(GL_RENDERBUFFER, formatInterne, m_largeur, m_hauteur);

Avec cet appel, nous demandons à créer un Render Buffer du type donné par le paramètre formatInterne (nous verrons ses valeurs possibles dans la partie qui suit) le tout avec les dimensions de notre FBO initial.

Si on ajoute ceci à notre méthode, on obtient :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);

	// Verrouillage
	glBindRenderbuffer(GL_RENDERBUFFER, id);

	// Configuration du Render Buffer
	glRenderbufferStorage(GL_RENDERBUFFER, formatInterne, m_largeur, m_hauteur);

	// Déverrouillage
	glBindRenderbuffer(GL_RENDERBUFFER, 0);
}

La méthode creerRenderBuffer() est maintenant terminée, nous pouvons l'utiliser quand bon nous semble. C'est d'ailleurs ce que nous allons faire tout de suite en utilisant tout ce que l'on vient de faire (Color et Render Buffers) dans le but de créer enfin notre premier FBO