FrameBuffer.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "FrameBuffer.h"
  2. // Constructeurs et Destructeur
  3. FrameBuffer::FrameBuffer() : m_id(0), m_largeur(0), m_hauteur(0), m_colorBuffers(0), m_depthBufferID(0), m_stencil(false)
  4. {}
  5. FrameBuffer::FrameBuffer(int largeur, int hauteur, bool stencil)
  6. : m_id(0), m_largeur(largeur), m_hauteur(hauteur), m_colorBuffers(0), m_depthBufferID(0), m_stencil(stencil)
  7. {}
  8. FrameBuffer::FrameBuffer(const FrameBuffer &frameBufferACopier)
  9. {
  10. // Copie de la largeur, de la hauteur et du booléen
  11. m_largeur = frameBufferACopier.m_largeur;
  12. m_hauteur = frameBufferACopier.m_hauteur;
  13. m_stencil = frameBufferACopier.m_stencil;
  14. // Chargement de la copie du Frame Buffer
  15. charger();
  16. }
  17. FrameBuffer::~FrameBuffer()
  18. {
  19. // Destruction des buffers
  20. glDeleteFramebuffers(1, &m_id);
  21. glDeleteRenderbuffers(1, &m_depthBufferID);
  22. }
  23. // Méthodes
  24. bool FrameBuffer::charger()
  25. {
  26. // Vérification d'un éventuel ancien FBO
  27. if(glIsFramebuffer(m_id) == GL_TRUE)
  28. {
  29. // Destruction du Frame Buffer
  30. glDeleteFramebuffers(1, &m_id);
  31. }
  32. // Génération d'un id
  33. glGenFramebuffers(1, &m_id);
  34. // Verrouillage du Frame Buffer
  35. glBindFramebuffer(GL_FRAMEBUFFER, m_id);
  36. // Création du Color Buffer
  37. Texture* colorBuffer(new Texture(m_largeur, m_hauteur));
  38. colorBuffer->create();
  39. // Ajout au tableau
  40. m_colorBuffers.push_back(colorBuffer);
  41. // Création du Depth Buffer et du Stencil Buffer (si besoin)
  42. if(m_stencil == true)
  43. creerRenderBuffer(m_depthBufferID, GL_DEPTH24_STENCIL8);
  44. else
  45. creerRenderBuffer(m_depthBufferID, GL_DEPTH_COMPONENT24);
  46. // Association du Color Buffer
  47. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBuffers[0]->getID(), 0);
  48. // Création du Depth Buffer et du Stencil Buffer (si besoin)
  49. if(m_stencil == true)
  50. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthBufferID);
  51. else
  52. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthBufferID);
  53. // Vérification de l'intégrité du FBO
  54. if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
  55. {
  56. // Libération des buffers
  57. glDeleteFramebuffers(1, &m_id);
  58. glDeleteRenderbuffers(1, &m_depthBufferID);
  59. // Affichage d'un message d'erreur et retour de la valeur false
  60. std::cout << "Erreur : le FBO est mal construit" << std::endl;
  61. return false;
  62. }
  63. // Déverrouillage du Frame Buffer
  64. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  65. // Si tout s'est bien passé, on renvoie la valeur true
  66. return true;
  67. }
  68. void FrameBuffer::creerRenderBuffer(GLuint &id, GLenum formatInterne)
  69. {
  70. // Destruction d'un éventuel ancien Render Buffer
  71. if(glIsRenderbuffer(id) == GL_TRUE)
  72. glDeleteRenderbuffers(1, &id);
  73. // Génération de l'identifiant
  74. glGenRenderbuffers(1, &id);
  75. // Verrouillage
  76. glBindRenderbuffer(GL_RENDERBUFFER, id);
  77. // Configuration du Render Buffer
  78. glRenderbufferStorage(GL_RENDERBUFFER, formatInterne, m_largeur, m_hauteur);
  79. // Déverrouillage
  80. glBindRenderbuffer(GL_RENDERBUFFER, 0);
  81. }
  82. // Getters
  83. GLuint FrameBuffer::getID() const
  84. {
  85. return m_id;
  86. }
  87. Texture* FrameBuffer::getColorBuffer(unsigned int index)
  88. {
  89. return m_colorBuffers[index];
  90. }
  91. int FrameBuffer::getLargeur() const
  92. {
  93. return m_largeur;
  94. }
  95. int FrameBuffer::getHauteur() const
  96. {
  97. return m_hauteur;
  98. }