8 glGenRenderbuffers(1, &
m_rb);
11 glGenFramebuffers(1, &
m_fbo);
13 glBindTexture(GL_TEXTURE_2D,
m_texId);
15 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
16 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
18 glBindTexture(GL_TEXTURE_2D, 0);
22 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
23 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
25 glBindTexture(GL_TEXTURE_2D, 0);
29 glBindFramebuffer(GL_FRAMEBUFFER,
m_fbo);
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);
35 GLuint buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
36 glDrawBuffers(2, buffers);
38 glReadBuffer(GL_COLOR_ATTACHMENT1);
40 GLenum e = glCheckFramebufferStatus(GL_FRAMEBUFFER);
41 if (e != GL_FRAMEBUFFER_COMPLETE)
42 cerr <<
"ERROR: fbo not complete" << endl;
44 glBindFramebuffer(GL_FRAMEBUFFER, 0);
50 glDeleteFramebuffers(1, &
m_fbo);
51 glDeleteRenderbuffers(1, &
m_rb);
58 glBindFramebuffer(GL_FRAMEBUFFER,
m_fbo);
60 glClearColor(0,0,0,0);
61 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
70 glBindFramebuffer(GL_FRAMEBUFFER, 0);
77 glBindRenderbuffer(GL_RENDERBUFFER,
m_rb);
79 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24,
m_size.x,
m_size.y);
81 glBindRenderbuffer(GL_RENDERBUFFER, 0);
85 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,
m_size.x,
m_size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE,
nullptr);
87 glBindTexture(GL_TEXTURE_2D, 0);
89 glBindTexture(GL_TEXTURE_2D,
m_texId);
93 glBindTexture(GL_TEXTURE_2D, 0);
95 glBindFramebuffer(GL_FRAMEBUFFER,
m_fbo);
97 glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH,
m_size.x);
98 glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT,
m_size.y);
100 GLenum e = glCheckFramebufferStatus(GL_FRAMEBUFFER);
101 if (e != GL_FRAMEBUFFER_COMPLETE)
102 cerr <<
"ERROR: fbo not complete" << endl;
104 glBindFramebuffer(GL_FRAMEBUFFER, 0);
109 auto _x = (int)center.x - (
int)distance;
110 auto _y = (int)center.y - (
int)distance;
112 glBindFramebuffer(GL_FRAMEBUFFER,
m_fbo);
114 glReadPixels(_x,_y,distance*2, distance*2, GL_RED_INTEGER,
GL_ID_TYPE, target);
116 glBindFramebuffer(GL_FRAMEBUFFER, 0);
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;
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;
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;
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;
142 glBindTexture(GL_TEXTURE_2D,
m_texId);
144 glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER,
GL_ID_TYPE, target);
146 glBindTexture(GL_TEXTURE_2D, 0);
150 glActiveTexture(GL_TEXTURE0 + target);
151 glBindTexture(GL_TEXTURE_2D,
m_texId);
155 glActiveTexture(GL_TEXTURE0 + target);
uint16 id_t
The data-type used for the id-buffer.
#define GL_ID_FORMAT
The OpenGL-format used for the id-buffer (has to match id_t)
mat4 const & getProjection() const
void bindIdTexture(GLuint target=0)
void bindSceneTexture(GLuint target=0)
SceneGraph & getSceneGraph()
void readAllIds(OUT id_t *target)
void draw(DrawArgs &args)
void resize(vec2 const &size)
SceneFBO(Application *app, uvec2 const &size)
#define GL_ID_TYPE
The OpenGL-type used for the id-buffer (has to match id_t)
void readIds(OUT id_t *target, uvec2 const center, uint const distance)
void draw(double time, double timeDelta)