35 GLuint rout = out, fbo, flipflop[2];
36 GLint vp[4], w, h, cfbo, ctex, cpId;
38 GLboolean dt = glIsEnabled(GL_DEPTH_TEST), bl = glIsEnabled(GL_BLEND);
41 glGetIntegerv(GL_POLYGON_MODE, polygonMode);
43 glGetIntegerv(GL_VIEWPORT, vp);
44 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &cfbo);
45 glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
46 glGetIntegerv(GL_CURRENT_PROGRAM, &cpId);
50 }
else if(
in == out) {
59 glBindTexture(GL_TEXTURE_2D, out);
60 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
61 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
64 flipflop[!(nb_iterations&1)] = rout;
67 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
69 if(dt) glDisable(GL_DEPTH_TEST);
70 if(bl) glDisable(GL_BLEND);
71 glViewport(0, 0, w, h);
72 glGenFramebuffers(1, &fbo);
73 glBindFramebuffer(GL_FRAMEBUFFER, fbo); {
74 GLfloat step[2] = { 1.0f / (w - 1.0f), 1.0f / (h - 1.0f) };
76 glUniform1i(glGetUniformLocation(
_medianPId,
"myTex"), 0);
77 glUniform1i(glGetUniformLocation(
_medianPId,
"inv"), flipV);
78 glUniform2fv(glGetUniformLocation(
_medianPId,
"step"), 1, step);
79 glActiveTexture(GL_TEXTURE0);
80 for(i = 0; i < nb_iterations; ++i) {
81 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, flipflop[i&1], 0);
82 glBindTexture(GL_TEXTURE_2D, (i == 0) ?
in : flipflop[!(i&1)]);
84 glUniform1i(glGetUniformLocation(
_medianPId,
"inv"), 0);
86 glBindTexture(GL_TEXTURE_2D, 0);
91 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
92 glBlitFramebuffer(0, 0, w, h, vp[0], vp[1], vp[0] + vp[2], vp[1] + vp[3], GL_COLOR_BUFFER_BIT, GL_LINEAR);
94 glViewport(vp[0], vp[1], vp[2], vp[3]);
95 glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)cfbo);
98 glPolygonMode(GL_FRONT_AND_BACK, polygonMode[0]);
100 if(bl) glEnable(GL_BLEND);
101 if(dt) glEnable(GL_DEPTH_TEST);
102 glDeleteFramebuffers(1, &fbo);