LayeredFramebuffer.cpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <iostream>
  2. #include "LayeredFramebuffer.h"
  3. LayeredFramebuffer::LayeredFramebuffer() : texture(0), buffer(0) {
  4. }
  5. LayeredFramebuffer::~LayeredFramebuffer() {
  6. glDeleteFramebuffers(1, &buffer);
  7. glDeleteTextures(1, &texture);
  8. }
  9. void LayeredFramebuffer::init(int width, int height, int depth) {
  10. glGenTextures(1, &texture);
  11. glBindTexture(GL_TEXTURE_3D, texture);
  12. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  13. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  14. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
  15. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
  16. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
  17. glTexImage3D(GL_TEXTURE_3D, 0, GL_R32F, width, height, depth, 0, GL_RED,
  18. GL_FLOAT, nullptr);
  19. glGenFramebuffers(1, &buffer);
  20. glBindFramebuffer(GL_FRAMEBUFFER, buffer);
  21. GLenum c = GL_COLOR_ATTACHMENT0;
  22. glFramebufferTexture3D(GL_FRAMEBUFFER, c, GL_TEXTURE_3D, texture, 0, 0);
  23. glDrawBuffers(1, &c);
  24. }
  25. void LayeredFramebuffer::bindAndClear() {
  26. glBindFramebuffer(GL_FRAMEBUFFER, buffer);
  27. glClear(GL_COLOR_BUFFER_BIT);
  28. }
  29. void LayeredFramebuffer::bindTextureTo(int unit) const {
  30. glActiveTexture(GL_TEXTURE0 + unit);
  31. glBindTexture(GL_TEXTURE_3D, texture);
  32. }
  33. void LayeredFramebuffer::bindLayer(int layer) {
  34. glBindFramebuffer(GL_FRAMEBUFFER, buffer);
  35. glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D,
  36. texture, 0, layer);
  37. }
  38. bool LayeredFramebuffer::hasError() const {
  39. GLenum error = glCheckFramebufferStatus(GL_FRAMEBUFFER);
  40. if(error == GL_FRAMEBUFFER_COMPLETE) {
  41. return false;
  42. }
  43. switch(error) {
  44. case GL_FRAMEBUFFER_UNDEFINED:
  45. std::cout << "undefined framebuffer\n";
  46. return true;
  47. case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
  48. std::cout << "incomplete framebuffer attachment\n";
  49. return true;
  50. case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
  51. std::cout << "incomplete missing framebuffer attachment\n";
  52. return true;
  53. case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
  54. std::cout << "incomplete framebuffer draw buffer\n";
  55. return true;
  56. case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
  57. std::cout << "incomplete framebuffer read buffer\n";
  58. return true;
  59. case GL_FRAMEBUFFER_UNSUPPORTED:
  60. std::cout << "unsupported framebuffer\n";
  61. return true;
  62. case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
  63. std::cout << "incomplete framebuffer multisample\n";
  64. return true;
  65. case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS:
  66. std::cout << "incomplete framebuffer layer targets\n";
  67. return true;
  68. }
  69. return "unknown error";
  70. }