source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/FrameBufferObject.cpp @ 2856

Revision 2856, 3.4 KB checked in by mattausch, 16 years ago (diff)
Line 
1#include <iostream>
2#include "FrameBufferObject.h"
3#include "glInterface.h"
4
5using namespace std;
6
7
8namespace CHCDemoEngine
9{
10
11
12void PrintFBOStatus(GLenum status)
13{
14        switch(status)
15        {
16        case GL_FRAMEBUFFER_COMPLETE_EXT:
17                cout << "frame buffer object created successfully" << endl;
18                break;
19        case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
20                cerr << "incomplete attachment" << endl;
21                break;
22        case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
23                cerr << "missing attachment" << endl;
24                break;
25        case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
26                cerr << "incomplete dimensions" << endl;
27                break;
28        case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
29                cerr << "incomplete formats" << endl;
30                break;
31        case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
32                cerr << "incomplete draw buffer" << endl;
33                break;
34        case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
35                cerr << "incomplete read buffer" << endl;
36                break;
37        case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
38                cerr << "framebuffer unsupported" << endl;
39                break;
40        default:
41                cerr << "unknown status code " << status << endl;
42        }
43}
44
45
46ColorBufferObject::ColorBufferObject(int w, int h,
47                                                                         FORMAT c,
48                                                                         WRAP_TYPE wrapType,
49                                                                         FILTER_TYPE filterType,
50                                                                         bool useMipMap,
51                                                                         bool useMultiSampling)
52{
53        glGenRenderbuffersEXT(1, &mId);
54        glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mId);
55        glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, w, h);
56       
57        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT, GL_RENDERBUFFER_EXT, mId);
58
59        glGenTextures(1, &mTexId);
60        glBindTexture(GL_TEXTURE_2D, mTexId);
61        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
62        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT, GL_TEXTURE_2D, mTexId, 0);
63
64        GLuint filterParam;
65
66        switch (filterType)
67        {
68        case WRAP_NEAREST:
69                filterParam = GL_NEAREST; break;
70        case WRAP_LINEAR:
71                filterParam = GL_LINEAR; break;
72        case WRAP_MIPMAP_LINEAR:
73                filterParam = GL_LINEAR_MIPMAP_LINEAR; break;
74        }
75
76       
77        GLuint wrapParam;
78
79        switch (wrapType)
80        {
81        case GL_REPEAT:
82                wrapParam = GL_NEAREST; break;
83        case GL_CLAMP_TO_EDGE:
84                wrapParam = GL_LINEAR; break;
85        }
86
87        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterParam);
88        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterParam);
89
90        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapParam);
91        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapParam);
92
93        PrintFBOStatus(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT));
94}
95
96
97FrameBufferObject::FrameBufferObject(int w, int h, bool useDepth, DEPTH_FORMAT d)
98: mWidth(w), mHeight(h)
99{
100        glGenFramebuffersEXT(1, &mId);
101        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mId);
102
103       
104        ///////////
105        //-- create depth buffer
106
107        if (useDepth)
108        {
109                glGenRenderbuffersEXT(1, &mDepthId);   
110                glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepthId);
111
112                GLuint depthFormat;
113
114                switch (d)
115                {
116                case DEPTH_16:
117                        depthFormat = GL_DEPTH_COMPONENT16; break;
118                case DEPTH_24:
119                        depthFormat = GL_DEPTH_COMPONENT24; break;
120                case DEPTH_32:
121                        depthFormat = GL_DEPTH_COMPONENT32; break;
122                }
123
124                glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, depthFormat, mWidth, mHeight);
125                glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepthId);
126
127                PrintFBOStatus(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT));
128        }
129}
130
131
132} // namespace
Note: See TracBrowser for help on using the repository browser.