1 #include "FrameBuffer.h"
2 
FrameBuffer()3 FrameBuffer::FrameBuffer()
4 {
5     Reset();
6 }
7 
~FrameBuffer()8 FrameBuffer::~FrameBuffer() {
9 }
10 
Reset()11 void FrameBuffer::Reset() {
12     mFrameBufferName = -1;
13     mTextureName = -1;
14     mWidth = 0;
15     mHeight = 0;
16     mFormat = -1;
17 }
18 
InitializeGLContext()19 bool FrameBuffer::InitializeGLContext() {
20     Reset();
21     return CreateBuffers();
22 }
23 
Init(int width,int height,GLenum format)24 bool 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 
CreateBuffers()69 bool FrameBuffer::CreateBuffers() {
70     glGenFramebuffers(1, &mFrameBufferName);
71     glGenTextures(1, &mTextureName);
72     if (!checkGlError("texture generation")) {
73         return false;
74     }
75     return true;
76 }
77 
GetTextureName() const78 GLuint FrameBuffer::GetTextureName() const {
79     return mTextureName;
80 }
81 
GetFrameBufferName() const82 GLuint FrameBuffer::GetFrameBufferName() const {
83     return mFrameBufferName;
84 }
85 
GetFormat() const86 GLenum FrameBuffer::GetFormat() const {
87     return mFormat;
88 }
89 
GetWidth() const90 int FrameBuffer::GetWidth() const {
91     return mWidth;
92 }
93 
GetHeight() const94 int FrameBuffer::GetHeight() const {
95     return mHeight;
96 }
97 
98 
99 
100