146 GLuint rout = out, fbo;
147 GLint vp[4], w, h, cfbo, ctex, cpId;
148 GLboolean dt = glIsEnabled(GL_DEPTH_TEST), bl = glIsEnabled(GL_BLEND);
150 GLint polygonMode[2];
151 glGetIntegerv(GL_POLYGON_MODE, polygonMode);
153 glGetIntegerv(GL_VIEWPORT, vp);
154 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &cfbo);
155 glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
156 glGetIntegerv(GL_CURRENT_PROGRAM, &cpId);
160 }
else if(
in == out) {
169 glBindTexture(GL_TEXTURE_2D, out);
170 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
171 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
177 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
179 if(dt) glDisable(GL_DEPTH_TEST);
180 if(bl) glDisable(GL_BLEND);
181 glViewport(0, 0, w, h);
182 glGenFramebuffers(1, &fbo);
183 glBindFramebuffer(GL_FRAMEBUFFER, fbo); {
184 GLfloat step[] = {1.0f / (GLfloat)w, 1.0f / (GLfloat)h};
185 GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
186 glDrawBuffers(2, buffers);
187 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
_tempTexId[2], 0);
188 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
_tempTexId[3], 0);
190 glUniform1i(glGetUniformLocation(
_cannyPId[0],
"inv"), 0);
191 glUniform1i(glGetUniformLocation(
_cannyPId[0],
"myTexture"), 0);
192 glUniform2fv(glGetUniformLocation(
_cannyPId[0],
"step"), 1, step);
193 glActiveTexture(GL_TEXTURE0);
194 glBindTexture(GL_TEXTURE_2D,
in);
196 glBindTexture(GL_TEXTURE_2D, 0);
197 glDrawBuffers(1, buffers);
199 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
_tempTexId[4], 0);
201 glUniform1i(glGetUniformLocation(
_cannyPId[1],
"len"), 0);
202 glUniform1i(glGetUniformLocation(
_cannyPId[1],
"dir"), 0);
203 glUniform1i(glGetUniformLocation(
_cannyPId[1],
"inv"), 0);
205 glUniform2fv(glGetUniformLocation(
_cannyPId[1],
"step"), 1, step);
208 glActiveTexture(GL_TEXTURE0);
210 glActiveTexture(GL_TEXTURE1);
213 glActiveTexture(GL_TEXTURE1);
214 glBindTexture(GL_TEXTURE_2D, 0);
215 glActiveTexture(GL_TEXTURE0);
216 glBindTexture(GL_TEXTURE_2D, 0);
220 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rout, 0);
222 glUniform1i(glGetUniformLocation(
_cannyPId[2],
"len"), 0);
223 glUniform1i(glGetUniformLocation(
_cannyPId[2],
"orig"), 1);
224 glUniform1i(glGetUniformLocation(
_cannyPId[2],
"inv"), flipV);
229 glActiveTexture(GL_TEXTURE0);
231 glActiveTexture(GL_TEXTURE1);
232 glBindTexture(GL_TEXTURE_2D,
in);
234 glActiveTexture(GL_TEXTURE1);
235 glBindTexture(GL_TEXTURE_2D, 0);
236 glActiveTexture(GL_TEXTURE0);
237 glBindTexture(GL_TEXTURE_2D, 0);
242 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
243 glBlitFramebuffer(0, 0, w, h, vp[0], vp[1], vp[0] + vp[2], vp[1] + vp[3], GL_COLOR_BUFFER_BIT, GL_LINEAR);
245 glViewport(vp[0], vp[1], vp[2], vp[3]);
246 glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)cfbo);
249 glPolygonMode(GL_FRONT_AND_BACK, polygonMode[0]);
251 if(bl) glEnable(GL_BLEND);
252 if(dt) glEnable(GL_DEPTH_TEST);
253 glDeleteFramebuffers(1, &fbo);