GLRenderToTexture.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. }
  71. else
  72. {
  73. glDrawBuffer(GL_NONE);
  74. }
  75. break;
  76. }
  77. default:
  78. {
  79. b3Assert(0);
  80. }
  81. };
  82. // Always check that our framebuffer is ok
  83. if (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)
  84. {
  85. status = true;
  86. }
  87. return status;
  88. }
  89. void GLRenderToTexture::disable()
  90. {
  91. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  92. }
  93. GLRenderToTexture::~GLRenderToTexture()
  94. {
  95. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  96. if (m_depthrenderbuffer)
  97. {
  98. glDeleteRenderbuffers(1, &m_depthrenderbuffer);
  99. }
  100. if (m_framebufferName)
  101. {
  102. glDeleteFramebuffers(1, &m_framebufferName);
  103. }
  104. }
  105. #endif