#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;
}