| #include "FrameBuffer.h" |
| |
| FrameBuffer::FrameBuffer() |
| { |
| Reset(); |
| } |
| |
| FrameBuffer::~FrameBuffer() { |
| } |
| |
| void FrameBuffer::Reset() { |
| mFrameBufferName = -1; |
| mTextureName = -1; |
| mWidth = 0; |
| mHeight = 0; |
| mFormat = -1; |
| } |
| |
| bool FrameBuffer::InitializeGLContext() { |
| Reset(); |
| return CreateBuffers(); |
| } |
| |
| bool FrameBuffer::Init(int width, int height, GLenum format) { |
| if (mFrameBufferName == (GLuint)-1) { |
| if (!CreateBuffers()) { |
| return false; |
| } |
| } |
| glBindFramebuffer(GL_FRAMEBUFFER, mFrameBufferName); |
| glBindTexture(GL_TEXTURE_2D, mTextureName); |
| |
| glTexImage2D(GL_TEXTURE_2D, |
| 0, |
| format, |
| width, |
| height, |
| 0, |
| format, |
| GL_UNSIGNED_BYTE, |
| NULL); |
| if (!checkGlError("bind/teximage")) { |
| return false; |
| } |
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
| // This is necessary to work with user-generated frame buffers with |
| // dimensions that are NOT powers of 2. |
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| |
| // Attach texture to frame buffer. |
| glFramebufferTexture2D(GL_FRAMEBUFFER, |
| GL_COLOR_ATTACHMENT0, |
| GL_TEXTURE_2D, |
| mTextureName, |
| 0); |
| checkFramebufferStatus("FrameBuffer.cpp"); |
| checkGlError("framebuffertexture2d"); |
| |
| if (!checkGlError("texture setup")) { |
| return false; |
| } |
| mWidth = width; |
| mHeight = height; |
| mFormat = format; |
| glBindFramebuffer(GL_FRAMEBUFFER, 0); |
| return true; |
| } |
| |
| bool FrameBuffer::CreateBuffers() { |
| glGenFramebuffers(1, &mFrameBufferName); |
| glGenTextures(1, &mTextureName); |
| if (!checkGlError("texture generation")) { |
| return false; |
| } |
| return true; |
| } |
| |
| GLuint FrameBuffer::GetTextureName() const { |
| return mTextureName; |
| } |
| |
| GLuint FrameBuffer::GetFrameBufferName() const { |
| return mFrameBufferName; |
| } |
| |
| GLenum FrameBuffer::GetFormat() const { |
| return mFormat; |
| } |
| |
| int FrameBuffer::GetWidth() const { |
| return mWidth; |
| } |
| |
| int FrameBuffer::GetHeight() const { |
| return mHeight; |
| } |