framebuffer.cpp 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "framebuffer.hpp"
  2. Framebuffer::Framebuffer( int w, int h ) {
  3. shader = new Shader( "textured.vert", "textured.frag" );
  4. glGenFramebuffers( 1, &fbuffer );
  5. glBindFramebuffer( GL_FRAMEBUFFER, fbuffer );
  6. glGenTextures(1, &image);
  7. glBindTexture(GL_TEXTURE_2D, image);
  8. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
  9. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  10. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  11. glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, image, 0);
  12. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  13. // generate our vertex and uv buffers
  14. std::vector<glm::vec2> verts;
  15. std::vector<glm::vec2> uvs;
  16. verts.push_back( glm::vec2(1,1) );
  17. uvs.push_back( glm::vec2( 1, 1 ) );
  18. verts.push_back( glm::vec2(-1,-1) );
  19. uvs.push_back( glm::vec2( 0, 0 ) );
  20. verts.push_back( glm::vec2(-1,1) );
  21. uvs.push_back( glm::vec2( 0, 1 ) );
  22. verts.push_back( glm::vec2(-1,-1) );
  23. uvs.push_back( glm::vec2( 0, 0 ) );
  24. verts.push_back( glm::vec2(1,1) );
  25. uvs.push_back( glm::vec2( 1, 1 ) );
  26. verts.push_back( glm::vec2(1,-1) );
  27. uvs.push_back( glm::vec2( 1, 0 ) );
  28. glGenBuffers( 2, buffers );
  29. glBindBuffer( GL_ARRAY_BUFFER, buffers[0] );
  30. glBufferData( GL_ARRAY_BUFFER, verts.size() * sizeof( glm::vec2 ), &verts[0], GL_STATIC_DRAW );
  31. glBindBuffer( GL_ARRAY_BUFFER, buffers[1] );
  32. glBufferData( GL_ARRAY_BUFFER, uvs.size() * sizeof( glm::vec2 ), &uvs[0], GL_STATIC_DRAW );
  33. vertCount = verts.size();
  34. }
  35. void Framebuffer::setShader( std::string name ) {
  36. delete shader;
  37. shader = new Shader( name + ".vert", name + ".frag" );
  38. }
  39. Framebuffer::~Framebuffer() {
  40. glDeleteTextures(1, &image);
  41. glDeleteFramebuffers(1,&fbuffer);
  42. glDeleteBuffers(2,buffers);
  43. delete shader;
  44. }
  45. void Framebuffer::resize( int w, int h ) {
  46. // Regenerate the image
  47. glDeleteTextures(1, &image);
  48. glBindTexture(GL_TEXTURE_2D, image);
  49. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
  50. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  51. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  52. // Re-bind it to the framebuffer
  53. glBindFramebuffer( GL_FRAMEBUFFER, fbuffer );
  54. glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, image, 0);
  55. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  56. }
  57. void Framebuffer::bind() {
  58. glBindFramebuffer( GL_FRAMEBUFFER, fbuffer );
  59. }
  60. void Framebuffer::unbind() {
  61. glBindFramebuffer( GL_FRAMEBUFFER, 0 );
  62. }
  63. void Framebuffer::draw(){
  64. shader->bind();
  65. shader->setParameter( "texture", 0 );
  66. shader->setAttribute( "position", buffers[0], 2 );
  67. shader->setAttribute( "uv", buffers[1], 2 );
  68. glActiveTexture(GL_TEXTURE0);
  69. glBindTexture( GL_TEXTURE_2D, image );
  70. glEnable( GL_TEXTURE_2D );
  71. glDrawArrays( GL_TRIANGLES, 0, vertCount );
  72. glDisable( GL_TEXTURE_2D );
  73. shader->unbind();
  74. }