3.6 Le Depth et le Stencil Buffer

Bien, on passe maintenant aux Render Buffers.

Dans la partie précédente, nous avons codé une méthode permettant d'en créer un très facilement. Son prototype est le suivant :

1
void creerRenderBuffer(GLuint &id, GLenum formatInterne);
  • id : référence sur l'identifiant représentant le buffer créé
  • formatInterne : Format interne du buffer

Fut un temps, nous aurions appelé cette méthode deux fois : une pour le Depth Buffer et l'autre pour le Stencil. Cependant, les choses ont changés et ce système ne semble plus fonctionner avec OpenGL 3. Au lieu d'avoir deux buffers séparés, nous n'en avons maintenant plus qu'un seul qui remplit le rôle du Depth et du Stencil.

Notre petit schéma n'est donc plus exact, il doit être modifié pour fusionner les deux Render Buffers :

plop

Ce schéma est plus proche de la réalité.

En définitif, nous n'appellerons pas la méthode creerRenderBuffer() deux fois mais une seule fois. Nous lui donnerons en paramètre l'attribut m_depthBufferID qui accueillera le "double-buffer" ainsi que la constante GL_DEPTH24_STENCIL8 pour le format interne. Cette constante permet de :

  • Définir une profondeur de 24 bits pour le Depth Buffer. Nous avons utilisé le même nombre au moment de configurer le contexte OpenGL avec la fonction SDL_GL_SetAttribute()
  • Même chose pour le Stencil Buffer mais avec seulement 8 bits cette fois-ci. Ce buffer prend moins de place en mémoire

L'appel final ressemble donc à ceci :

1
2
// Création du Depth et du Stencil Buffer
creerRenderBuffer(m_depthBufferID, GL_DEPTH24_STENCIL8);

Attention, nous utilisons bien une référence pour le premier paramètre, ce n'est donc pas une copie qui est envoyée à la méthode.

Quelle simplicité, nous venons de créer un double-buffer en seulement une lignes de code.

Petite récapitulatif :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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);

	// Création du Color Buffer
	Texture colorBuffer(m_largeur, m_hauteur, GL_RGBA, GL_RGBA, true);
	colorBuffer.chargerTextureVide();

	// Ajout au tableau
	m_colorBuffers.push_back(colorBuffer);

	// Création du Depth et du Stencil Buffer
	creerRenderBuffer(m_depthBufferID, GL_DEPTH24_STENCIL8);

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