#include "FrameBuffer.h" // Constructeurs et Destructeur FrameBuffer::FrameBuffer() : m_id(0), m_largeur(0), m_hauteur(0), m_colorBuffers(0), m_depthBufferID(0), m_stencil(false) {} FrameBuffer::FrameBuffer(int largeur, int hauteur, bool stencil) : m_id(0), m_largeur(largeur), m_hauteur(hauteur), m_colorBuffers(0), m_depthBufferID(0), m_stencil(stencil) {} FrameBuffer::FrameBuffer(const FrameBuffer &frameBufferACopier) { // Copie de la largeur, de la hauteur et du bool�en m_largeur = frameBufferACopier.m_largeur; m_hauteur = frameBufferACopier.m_hauteur; m_stencil = frameBufferACopier.m_stencil; // Chargement de la copie du Frame Buffer charger(); } FrameBuffer::~FrameBuffer() { // Destruction des buffers glDeleteFramebuffers(1, &m_id); glDeleteRenderbuffers(1, &m_depthBufferID); } // M�thodes bool FrameBuffer::charger() { // V�rification d'un �ventuel ancien FBO if(glIsFramebuffer(m_id) == GL_TRUE) { // Destruction du Frame Buffer 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(new Texture(m_largeur, m_hauteur)); colorBuffer->create(); // Ajout au tableau m_colorBuffers.push_back(colorBuffer); // Cr�ation du Depth Buffer et du Stencil Buffer (si besoin) if(m_stencil == true) creerRenderBuffer(m_depthBufferID, GL_DEPTH24_STENCIL8); else creerRenderBuffer(m_depthBufferID, GL_DEPTH_COMPONENT24); // Association du Color Buffer glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBuffers[0]->getID(), 0); // Cr�ation du Depth Buffer et du Stencil Buffer (si besoin) if(m_stencil == true) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthBufferID); else glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthBufferID); // V�rification de l'int�grit� du FBO if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { // Lib�ration des buffers glDeleteFramebuffers(1, &m_id); glDeleteRenderbuffers(1, &m_depthBufferID); // Affichage d'un message d'erreur et retour de la valeur false std::cout << "Erreur : le FBO est mal construit" << std::endl; return false; } // D�verrouillage du Frame Buffer glBindFramebuffer(GL_FRAMEBUFFER, 0); // Si tout s'est bien pass�, on renvoie la valeur true return true; } 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); } // Getters GLuint FrameBuffer::getID() const { return m_id; } Texture* FrameBuffer::getColorBuffer(unsigned int index) { return m_colorBuffers[index]; } int FrameBuffer::getLargeur() const { return m_largeur; } int FrameBuffer::getHauteur() const { return m_hauteur; }