framebuffer.cpp 3.4KB

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