You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.3 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. #include "FBO.h"
  2. FBO::FBO()
  3. {
  4. glGenFramebuffers(1, &mFBO);
  5. }
  6. void FBO::AttachColorBuffer(const char*bufferName, GLenum attachment, GLenum dataType, int width, int height)
  7. {
  8. GLuint colorBuffer;
  9. glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
  10. glGenTextures(1, &colorBuffer);
  11. glBindTexture(GL_TEXTURE_2D, colorBuffer);
  12. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  13. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  14. if (dataType == GL_RGBA16F)
  15. {
  16. glTexImage2D(GL_TEXTURE_2D, 0, dataType, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT, NULL);
  17. }
  18. else
  19. {
  20. glTexImage2D(GL_TEXTURE_2D, 0, dataType, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
  21. }
  22. glBindTexture(GL_TEXTURE_2D, 0);
  23. glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, colorBuffer, 0);
  24. mDrawBuffers.push_back(attachment);
  25. mBuffers.insert(std::pair<std::string, GLuint>(bufferName, colorBuffer));
  26. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  27. }
  28. void FBO::AttachDepthBuffer(const char*bufferName, int width, int height)
  29. {
  30. GLuint depthMap;
  31. glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
  32. glGenTextures(1, &depthMap);
  33. glBindTexture(GL_TEXTURE_2D, depthMap);
  34. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  35. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  36. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  37. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  38. glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
  39. glBindTexture(GL_TEXTURE_2D, 0);
  40. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0);
  41. mBuffers.insert(std::pair<std::string, GLuint>(bufferName, depthMap));
  42. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  43. }
  44. void FBO::Finish()
  45. {
  46. int nCount = (int)mDrawBuffers.size();
  47. if (nCount>0)
  48. {
  49. GLenum *buffers = new GLenum[nCount];
  50. int i = 0;
  51. while (i<nCount)
  52. {
  53. buffers[i++] = mDrawBuffers[i];
  54. }
  55. glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
  56. glDrawBuffers(nCount, buffers);
  57. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  58. }
  59. }
  60. void FBO::Bind()
  61. {
  62. glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
  63. }
  64. void FBO::Unbind()
  65. {
  66. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  67. }
  68. GLuint FBO::GetBuffer(const char*bufferName)
  69. {
  70. auto iter = mBuffers.find(bufferName);
  71. if (iter != mBuffers.end())
  72. {
  73. return iter->second;
  74. }
  75. return 0;
  76. }