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 checkFramebufferStatus("FrameBuffer.cpp");
59 checkGlError("framebuffertexture2d");
60
61 if (!checkGlError("texture setup")) {
62 return false;
63 }
64 mWidth = width;
65 mHeight = height;
66 mFormat = format;
67 glBindFramebuffer(GL_FRAMEBUFFER, 0);
68 return true;
69 }
70
CreateBuffers()71 bool FrameBuffer::CreateBuffers() {
72 glGenFramebuffers(1, &mFrameBufferName);
73 glGenTextures(1, &mTextureName);
74 if (!checkGlError("texture generation")) {
75 return false;
76 }
77 return true;
78 }
79
GetTextureName() const80 GLuint FrameBuffer::GetTextureName() const {
81 return mTextureName;
82 }
83
GetFrameBufferName() const84 GLuint FrameBuffer::GetFrameBufferName() const {
85 return mFrameBufferName;
86 }
87
GetFormat() const88 GLenum FrameBuffer::GetFormat() const {
89 return mFormat;
90 }
91
GetWidth() const92 int FrameBuffer::GetWidth() const {
93 return mWidth;
94 }
95
GetHeight() const96 int FrameBuffer::GetHeight() const {
97 return mHeight;
98 }
99