3.5 Le Color Buffer

Comme dit un peu plus, la configuration du FBO va être d'une simplicité enfantine. Nous avons déjà tout codé dans les parties précédentes, nous n'avons juste qu'à appeler nos nouvelles méthodes pour créer nos différents buffers.

Le premier dont nous allons nous occuper est le Color Buffer. En théorie, nous devrions gérer le cas où nous en utiliserions 16 comme le permet OpenGL, cependant je ne veux pas vous alourdir encore plus les explications surtout avec tout ce que l'on a vu jusqu'à maintenant. Nous verrons donc cela dans la dernière partie de ce chapitre qui sera consacrée aux améliorations.

En attendant, nous allons gérer le cas où nous utilisons un seul et unique Color Buffer qui correspond, je vous le rappelle, à une texture. La première étape consistera à créer un nouvel objet de type Texture grâce au nouveau constructeur de cette classe.

1
Texture(int largeur, int hauteur, GLenum format, GLenum formatInterne, bool textureVide);

Celui-ci prendra en paramètres :

  • Les dimensions du FBO : parce qu'il faut bien que les buffers fassent la même taille que lui. Ces dimensions sont représentées par les attributs m_largeur et m_hauteur de notre classe
  • Le format : qui correspond au format des couleurs (3 ou 4 couleurs avec le canal Alpha). Nous lui affecterons la constante GL_RGBA
  • Le format interne des couleurs : qui correspond au interne de la texture (l'ordre des couleurs). Bizarrement, nous lui affecterons la constante GL_RGBA, celle-ci fonctionne pour les deux paramètres
  • Le booléen textureVide : qui sera utile en cas de copie de texture pour savoir quelle méthode appeler (charger() ou chargerTextureVide()). Il faut lui affecter la valeur true évidemment

Nous créons donc un objet Texture en utilisant ce constructeur :

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

Ensuite, on appelle la méthode chargerTextureVide() de notre nouvel objet de façon à l'initialiser avec les bonnes dimensions et les bons formats :

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

Enfin, on l'ajoute au tableau dynamique m_colorBuffers. Ce dernier ne contiendra qu'une seule texture pour le moment mais n'oubliez pas que nous allons gérer les autre cas un peu plus tard :

1
2
3
4
5
// 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);

Petit récapitulatif :

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

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