GLRenderToTexture.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #ifndef NO_OPENGL3
  2. ///See http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-14-render-to-texture/
  3. #include "GLRenderToTexture.h"
  4. #include "Bullet3Common/b3Scalar.h" // for b3Assert
  5. #include <string.h>
  6. #include <stdio.h>
  7. bool gIntelLinuxglDrawBufferWorkaround=false;
  8. GLRenderToTexture::GLRenderToTexture()
  9. :m_framebufferName(0)
  10. {
  11. #if !defined(_WIN32) && !defined(__APPLE__)
  12. const GLubyte* ven = glGetString(GL_VENDOR);
  13. printf("ven = %s\n",ven);
  14. if (strncmp((const char*)ven,"Intel",5)==0)
  15. {
  16. printf("Workaround for some crash in the Intel OpenGL driver on Linux/Ubuntu\n");
  17. gIntelLinuxglDrawBufferWorkaround=true;
  18. }
  19. #endif//!defined(_WIN32) && !defined(__APPLE__)
  20. }
  21. void GLRenderToTexture::init(int width, int height, GLuint textureId, int renderTextureType)
  22. {
  23. m_renderTextureType = renderTextureType;
  24. glGenFramebuffers(1, &m_framebufferName);
  25. glBindFramebuffer(GL_FRAMEBUFFER, m_framebufferName);
  26. // The depth buffer
  27. // glGenRenderbuffers(1, &m_depthrenderbuffer);
  28. // glBindRenderbuffer(GL_RENDERBUFFER, m_depthrenderbuffer);
  29. // glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
  30. // glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthrenderbuffer);
  31. switch (m_renderTextureType)
  32. {
  33. case RENDERTEXTURE_COLOR:
  34. {
  35. glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureId, 0);
  36. break;
  37. }
  38. case RENDERTEXTURE_DEPTH:
  39. {
  40. glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, textureId, 0);
  41. break;
  42. }
  43. default:
  44. {
  45. b3Assert(0);
  46. }
  47. };
  48. glBindFramebuffer( GL_FRAMEBUFFER, 0 );
  49. }
  50. bool GLRenderToTexture::enable()
  51. {
  52. bool status = false;
  53. glBindFramebuffer(GL_FRAMEBUFFER, m_framebufferName);
  54. switch (m_renderTextureType)
  55. {
  56. case RENDERTEXTURE_COLOR:
  57. {
  58. // Set the list of draw buffers.
  59. GLenum drawBuffers[2] = {GL_COLOR_ATTACHMENT0,0};
  60. glDrawBuffers(1, drawBuffers);
  61. break;
  62. }
  63. case RENDERTEXTURE_DEPTH:
  64. {
  65. //Intel OpenGL driver crashes when using GL_NONE for glDrawBuffer on Linux, so use a workaround
  66. if (gIntelLinuxglDrawBufferWorkaround)
  67. {
  68. GLenum drawBuffers[2] = { GL_COLOR_ATTACHMENT0,0};
  69. glDrawBuffers(1, drawBuffers);
  70. } else
  71. {
  72. glDrawBuffer(GL_NONE);
  73. }
  74. break;
  75. }
  76. default:
  77. {
  78. b3Assert(0);
  79. }
  80. };
  81. // Always check that our framebuffer is ok
  82. if(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)
  83. {
  84. status = true;
  85. }
  86. return status;
  87. }
  88. void GLRenderToTexture::disable()
  89. {
  90. glBindFramebuffer( GL_FRAMEBUFFER, 0 );
  91. }
  92. GLRenderToTexture::~GLRenderToTexture()
  93. {
  94. glBindFramebuffer( GL_FRAMEBUFFER, 0 );
  95. if (m_depthrenderbuffer)
  96. {
  97. glDeleteRenderbuffers(1,&m_depthrenderbuffer);
  98. }
  99. if( m_framebufferName)
  100. {
  101. glDeleteFramebuffers(1, &m_framebufferName);
  102. }
  103. }
  104. #endif