jubilant-funicular
FrameBuffer.cpp
1 #include "nta/FrameBuffer.h"
2 #include "nta/Logger.h"
3 
4 namespace nta {
6  if (m_fbo != 0) destroy();
7  Logger::writeToLog("Initializing FrameBuffer...");
8  glGenFramebuffers(1, &m_fbo);
9  Logger::writeToLog("Initialized FrameBuffer");
10  }
11  void FrameBuffer::use() const {
12  glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
13  }
14  void FrameBuffer::set_texture(GLuint idx) const {
15  if (idx >= m_texs.size()) return;
16  glDrawBuffer(GL_COLOR_ATTACHMENT0 + idx);
17  glReadBuffer(GL_COLOR_ATTACHMENT0 + idx);
18  }
19  void FrameBuffer::unuse() const {
20  glDrawBuffer(GL_COLOR_ATTACHMENT0);
21  glReadBuffer(GL_COLOR_ATTACHMENT0);
22  glBindFramebuffer(GL_FRAMEBUFFER, 0);
23  }
24  GLuint FrameBuffer::add_texture(GLuint width, GLuint height,
25  GLint min_filt, GLint mag_filt, bool rgba) {
26  Logger::writeToLog("Adding texture to FrameBuffer " + std::to_string(m_fbo) + "...");
27  use();
28 
29  GLuint tex;
30  glGenTextures(1, &tex);
31  glBindTexture(GL_TEXTURE_2D, tex);
32 
33  auto format = rgba ? GL_RGBA : GL_RGB;
34  glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format,
35  GL_UNSIGNED_BYTE, nullptr);
36  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filt);
37  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filt);
38 
39  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + m_texs.size(),
40  GL_TEXTURE_2D, tex, 0);
41  glBindTexture(GL_TEXTURE_2D, 0);
42 
43  m_texs.push_back(tex);
44  unuse();
45  Logger::writeToLog("Added texture " + std::to_string(tex) + " associated with color attachment " + std::to_string(m_texs.size()-1));
46  return m_texs.size()-1;
47  }
48  GLuint FrameBuffer::get_tex(GLuint idx) const {
49  return idx < m_texs.size() ? m_texs[idx] : 0;
50  }
51  GLuint FrameBuffer::get_width(GLuint idx) const {
52  if (idx >= m_texs.size()) return 0;
53  glBindTexture(GL_TEXTURE_2D, m_texs[idx]);
54  GLint width;
55  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
56  glBindTexture(GL_TEXTURE_2D, 0);
57  return width;
58  }
59  GLuint FrameBuffer::get_height(GLuint idx) const {
60  if (idx >= m_texs.size()) return 0;
61  glBindTexture(GL_TEXTURE_2D, m_texs[idx]);
62  GLint height;
63  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
64  glBindTexture(GL_TEXTURE_2D, 0);
65  return height;
66  }
68  if (m_fbo == 0) return;
69  Logger::writeToLog("Destroying FrameBuffer...");
70  glDeleteFramebuffers(1, &m_fbo);
71  glDeleteTextures(m_texs.size(), &m_texs[0]);
72  m_texs.clear();
73  m_fbo = 0;
74  Logger::writeToLog("Destroyed FrameBuffer");
75  }
76 }
nta::FrameBuffer::init
void init()
Initializes a new FrameBuffer (deleting the old one if it existed)
Definition: FrameBuffer.cpp:5
nta::Logger::writeToLog
static void writeToLog(crstring entry)
writes an entry in the log
Definition: Logger.cpp:17
nta::FrameBuffer::get_tex
GLuint get_tex(GLuint idx=0) const
Returns id of texture associated with GL_COLOR_ATTACHMENTidx.
Definition: FrameBuffer.cpp:48
nta::FrameBuffer::add_texture
GLuint add_texture(GLuint width, GLuint height, GLint min_filt=GL_LINEAR, GLint mag_filt=GL_LINEAR, bool rgba=true)
Returns index of added texture.
Definition: FrameBuffer.cpp:24
nta::FrameBuffer::set_texture
void set_texture(GLuint idx=0) const
Sets which texture to draw to.
Definition: FrameBuffer.cpp:14
nta::FrameBuffer::get_width
GLuint get_width(GLuint idx=0) const
Returns width of texture associated with GL_COLOR_ATTACHMENTidx.
Definition: FrameBuffer.cpp:51
nta::FrameBuffer::m_texs
std::vector< GLuint > m_texs
The textures to draw to.
Definition: FrameBuffer.h:15
nta
Definition: Animation2D.h:6
nta::FrameBuffer::get_height
GLuint get_height(GLuint idx=0) const
Returns height of texture associated with GL_COLOR_ATTACHMENTidx.
Definition: FrameBuffer.cpp:59
nta::FrameBuffer::unuse
void unuse() const
Binds the default FrameBuffer (i.e. the screen)
Definition: FrameBuffer.cpp:19
nta::FrameBuffer::m_fbo
GLuint m_fbo
The id of this frame buffer.
Definition: FrameBuffer.h:13
nta::FrameBuffer::use
void use() const
Binds this FrameBuffer.
Definition: FrameBuffer.cpp:11
nta::FrameBuffer::destroy
void destroy()
Destroys this FrameBuffer.
Definition: FrameBuffer.cpp:67