1#include "FrameBuffer.h" 2 3FrameBuffer::FrameBuffer() 4{ 5 Reset(); 6} 7 8FrameBuffer::~FrameBuffer() { 9} 10 11void FrameBuffer::Reset() { 12 mFrameBufferName = -1; 13 mTextureName = -1; 14 mWidth = 0; 15 mHeight = 0; 16 mFormat = -1; 17} 18 19bool FrameBuffer::InitializeGLContext() { 20 Reset(); 21 return CreateBuffers(); 22} 23 24bool FrameBuffer::Init(int width, int height, GLenum format) { 25 if (mFrameBufferName == (GLuint)-1) { 26 if (!CreateBuffers()) { 27 return false; 28 } 29 } 30 glBindFramebuffer(GL_FRAMEBUFFER, mFrameBufferName); 31 glBindTexture(GL_TEXTURE_2D, mTextureName); 32 33 glTexImage2D(GL_TEXTURE_2D, 34 0, 35 format, 36 width, 37 height, 38 0, 39 format, 40 GL_UNSIGNED_BYTE, 41 NULL); 42 if (!checkGlError("bind/teximage")) { 43 return false; 44 } 45 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 46 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 47 // This is necessary to work with user-generated frame buffers with 48 // dimensions that are NOT powers of 2. 49 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 50 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 51 52 // Attach texture to frame buffer. 53 glFramebufferTexture2D(GL_FRAMEBUFFER, 54 GL_COLOR_ATTACHMENT0, 55 GL_TEXTURE_2D, 56 mTextureName, 57 0); 58 59 if (!checkGlError("texture setup")) { 60 return false; 61 } 62 mWidth = width; 63 mHeight = height; 64 mFormat = format; 65 glBindFramebuffer(GL_FRAMEBUFFER, 0); 66 return true; 67} 68 69bool FrameBuffer::CreateBuffers() { 70 glGenFramebuffers(1, &mFrameBufferName); 71 glGenTextures(1, &mTextureName); 72 if (!checkGlError("texture generation")) { 73 return false; 74 } 75 return true; 76} 77 78GLuint FrameBuffer::GetTextureName() const { 79 return mTextureName; 80} 81 82GLuint FrameBuffer::GetFrameBufferName() const { 83 return mFrameBufferName; 84} 85 86GLenum FrameBuffer::GetFormat() const { 87 return mFormat; 88} 89 90int FrameBuffer::GetWidth() const { 91 return mWidth; 92} 93 94int FrameBuffer::GetHeight() const { 95 return mHeight; 96} 97 98 99 100