Number5
Visualisierung 2 Project - Florian Schober (0828151, f.schober@live.com), Andreas Walch (0926780, walch.andreas89@gmail.com)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SceneFBO.cpp
Go to the documentation of this file.
1 #include "Application.hpp"
2 
3 
4 SceneFBO::SceneFBO(Application* app, uvec2 const & size)
5  : m_app(app)
6  , m_size(size)
7 {
8  glGenRenderbuffers(1, &m_rb);
9  glGenTextures(1, &m_texScene);
10  glGenTextures(1, &m_texId);
11  glGenFramebuffers(1, &m_fbo);
12 
13  glBindTexture(GL_TEXTURE_2D, m_texId);
14  {
15  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
16  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
17  }
18  glBindTexture(GL_TEXTURE_2D, 0);
19 
20  glBindTexture(GL_TEXTURE_2D, m_texScene);
21  {
22  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
23  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
24  }
25  glBindTexture(GL_TEXTURE_2D, 0);
26 
27  resize(m_size);
28 
29  glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
30  {
31  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rb);
32  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_texScene, 0);
33  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, m_texId, 0);
34 
35  GLuint buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
36  glDrawBuffers(2, buffers);
37 
38  glReadBuffer(GL_COLOR_ATTACHMENT1);
39 
40  GLenum e = glCheckFramebufferStatus(GL_FRAMEBUFFER);
41  if (e != GL_FRAMEBUFFER_COMPLETE)
42  cerr << "ERROR: fbo not complete" << endl;
43  }
44  glBindFramebuffer(GL_FRAMEBUFFER, 0);
45 
46 }
47 
49 {
50  glDeleteFramebuffers(1, &m_fbo);
51  glDeleteRenderbuffers(1, &m_rb);
52  glDeleteTextures(1, &m_texScene);
53  glDeleteTextures(1, &m_texId);
54 }
55 
56 void SceneFBO::draw(double time, double timeDelta)
57 {
58  glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
59  {
60  glClearColor(0,0,0,0);
61  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
62 
63  DrawArgs args(time,
64  timeDelta,
66  &(m_app->getCamera().getView()));
67 
68  m_app->getSceneGraph().draw(args);
69  }
70  glBindFramebuffer(GL_FRAMEBUFFER, 0);
71 }
72 
73 void SceneFBO::resize(vec2 const & size)
74 {
75  m_size = size;
76 
77  glBindRenderbuffer(GL_RENDERBUFFER, m_rb);
78  {
79  glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, m_size.x, m_size.y);
80  }
81  glBindRenderbuffer(GL_RENDERBUFFER, 0);
82 
83  glBindTexture(GL_TEXTURE_2D, m_texScene);
84  {
85  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_size.x, m_size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
86  }
87  glBindTexture(GL_TEXTURE_2D, 0);
88 
89  glBindTexture(GL_TEXTURE_2D, m_texId);
90  {
91  glTexImage2D(GL_TEXTURE_2D, 0, GL_ID_FORMAT, m_size.x, m_size.y, 0, GL_RED_INTEGER, GL_ID_TYPE, nullptr);
92  }
93  glBindTexture(GL_TEXTURE_2D, 0);
94 
95  glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
96  {
97  glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, m_size.x);
98  glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, m_size.y);
99 
100  GLenum e = glCheckFramebufferStatus(GL_FRAMEBUFFER);
101  if (e != GL_FRAMEBUFFER_COMPLETE)
102  cerr << "ERROR: fbo not complete" << endl;
103  }
104  glBindFramebuffer(GL_FRAMEBUFFER, 0);
105 }
106 
107 void SceneFBO::readIds(OUT id_t* target, uvec2 const center, uint const distance)
108 {
109  auto _x = (int)center.x - (int)distance;
110  auto _y = (int)center.y - (int)distance;
111 
112  glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
113  {
114  glReadPixels(_x,_y,distance*2, distance*2, GL_RED_INTEGER, GL_ID_TYPE, target);
115  }
116  glBindFramebuffer(GL_FRAMEBUFFER, 0);
117 
118 
119  // outside: left
120  for (size_t x = 0; (int)x < -_x; x++)
121  for (size_t y = 0; y < 2*distance; y++)
122  target[y * 2 * distance + x] = (id_t)0;
123 
124 
125  // outside: right
126  for (size_t x = 4*distance - _x + m_size.x; x < 2*distance; x++)
127  for (size_t y = 0; y < 2*distance; y++)
128  target[y * 2 * distance + x] = (id_t)0;
129 
130  // outside: top
131  for (size_t x = 0; x < 2*distance; x++)
132  for (size_t y = 0; (int)y < -_y; y++)
133  target[y * 2 * distance + x] = (id_t)0;
134 
135  // outside: bottom
136  for (size_t x = 0; x < 2*distance; x++)
137  for (size_t y = 4*distance - _y + m_size.y; y < (2*distance); y++)
138  target[y * 2 * distance + x] = (id_t)0;
139 }
140 void SceneFBO::readAllIds(OUT id_t* target)
141 {
142  glBindTexture(GL_TEXTURE_2D, m_texId);
143  {
144  glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, GL_ID_TYPE, target);
145  }
146  glBindTexture(GL_TEXTURE_2D, 0);
147 }
148 void SceneFBO::bindIdTexture(GLuint target)
149 {
150  glActiveTexture(GL_TEXTURE0 + target);
151  glBindTexture(GL_TEXTURE_2D, m_texId);
152 }
153 void SceneFBO::bindSceneTexture(GLuint target)
154 {
155  glActiveTexture(GL_TEXTURE0 + target);
156  glBindTexture(GL_TEXTURE_2D, m_texScene);
157 }
uint16 id_t
The data-type used for the id-buffer.
Definition: Util.hpp:6
GLuint m_fbo
Definition: SceneFBO.hpp:38
#define GL_ID_FORMAT
The OpenGL-format used for the id-buffer (has to match id_t)
Definition: Util.hpp:12
mat4 const & getView()
Definition: Camera.hpp:46
GLuint m_rb
Definition: SceneFBO.hpp:39
GLuint m_texScene
Definition: SceneFBO.hpp:41
mat4 const & getProjection() const
Definition: Window.hpp:30
void bindIdTexture(GLuint target=0)
Definition: SceneFBO.cpp:148
void bindSceneTexture(GLuint target=0)
Definition: SceneFBO.cpp:153
Camera & getCamera()
Definition: Application.hpp:76
SceneGraph & getSceneGraph()
Definition: Application.hpp:56
Window & getWindow()
Definition: Application.hpp:41
void readAllIds(OUT id_t *target)
Definition: SceneFBO.cpp:140
void draw(DrawArgs &args)
Definition: SceneGraph.cpp:41
~SceneFBO()
Definition: SceneFBO.cpp:48
void resize(vec2 const &size)
Definition: SceneFBO.cpp:73
GLuint m_texId
Definition: SceneFBO.hpp:40
SceneFBO(Application *app, uvec2 const &size)
Definition: SceneFBO.cpp:4
#define GL_ID_TYPE
The OpenGL-type used for the id-buffer (has to match id_t)
Definition: Util.hpp:9
void readIds(OUT id_t *target, uvec2 const center, uint const distance)
Definition: SceneFBO.cpp:107
Application * m_app
Definition: SceneFBO.hpp:37
uvec2 m_size
Definition: SceneFBO.hpp:42
void draw(double time, double timeDelta)
Definition: SceneFBO.cpp:56