GL4Dummies  0.1.7
Référence du fichier gl4dfMedian.c

filre médian à partir d'une texture ou l'écran vers une texture ou l'écran. Plus de détails...

#include "gl4du.h"
#include "gl4df.h"
#include "gl4dfCommon.h"
Graphe des dépendances par inclusion de gl4dfMedian.c:

Aller au code source de ce fichier.

Fonctions

static void init (void)
 
static void quit (void)
 
 MKFWINIT4 (median, void, GLuint, GLuint, GLuint, GLboolean)
 
void gl4dfMedian (GLuint in, GLuint out, GLuint nb_iterations, GLboolean flipV)
 Filtre 2D médian 3x3. Plus de détails...
 
static void medianfinit (GLuint in, GLuint out, GLuint nb_iterations, GLboolean flipV)
 
static void medianffunc (GLuint in, GLuint out, GLuint nb_iterations, GLboolean flipV)
 

Variables

static GLuint _medianPId = 0
 
static GLuint _tempTexId [3] = {0}
 

Description détaillée

filre médian à partir d'une texture ou l'écran vers une texture ou l'écran.

Auteur
Farès BELHADJ amsi@.nosp@m.ai.u.nosp@m.niv-p.nosp@m.aris.nosp@m.8.fr
Date
March 08, 2017

Définition dans le fichier gl4dfMedian.c.

Documentation des fonctions

◆ gl4dfMedian()

void gl4dfMedian ( GLuint  in,
GLuint  out,
GLuint  nb_iterations,
GLboolean  flipV 
)

Filtre 2D médian 3x3.

Paramètres
inidentifiant de texture source. Si 0, le framebuffer écran est pris à la place.
outidentifiant de texture destination. Si 0, la sortie s'effectuera à l'écran.
nb_iterationsle nombre d'itérations de filtre médian.
flipVindique s'il est nécessaire d'effectuer un mirroir vertical du résultat.
22  {
23  medianfptr(in, out, nb_iterations, flipV);
24 }

Références in().

◆ init()

static void init ( void  )
static
105  {
106  GLint ctex;
107  GLuint i;
108  glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
109  if(!_tempTexId[0])
110  glGenTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
111  for(i = 0; i < (sizeof _tempTexId / sizeof *_tempTexId); ++i) {
112  glBindTexture(GL_TEXTURE_2D, _tempTexId[i]);
113  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
114  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
115  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
116  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
117  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
118  }
119  glBindTexture(GL_TEXTURE_2D, ctex);
120  if(!_medianPId) {
121  const char * imfs =
122  "<imfs>gl4df_median.fs</imfs>\n"
123 #ifdef __GLES4D__
124  "#version 300 es\n"
125 #else
126  "#version 330\n"
127 #endif
128  "in vec2 vsoTexCoord;\n\
129  out vec4 fragColor;\n\
130  uniform sampler2D myTex;\n\
131  uniform vec2 step;\n\
132  vec2 offset[9] = vec2[](vec2(-step.x , -step.y), vec2( 0.0, -step.y), vec2( step.x , -step.y), \n\
133  vec2(-step.x, 0.0), vec2( 0.0, 0.0), vec2( step.x, 0.0), \n\
134  vec2(-step.x, step.y), vec2( 0.0, step.y), vec2( step.x , step.y) );\n\
135  vec4 median(void) {\n\
136  vec4 echantillon[9], c;\n\
137  echantillon[0].rgb = texture(myTex, vsoTexCoord.st + offset[0]).rgb;\n\
138  echantillon[0].a = dot(echantillon[0].rgb, echantillon[0].rgb);\n\
139  for(int i = 1, j; i < 9; i++) {\n\
140  c.rgb = texture(myTex, vsoTexCoord.st + offset[i]).rgb;\n\
141  c.a = dot(c.rgb, c.rgb);\n\
142  for(j = 0; j < i; j++)\n\
143  if(c.a > echantillon[j].a) break; // PUTAIN !!!!!!!\n\
144  for(int k = i - 1; k >= j; k--)\n\
145  echantillon[k + 1] = echantillon[k];\n\
146  echantillon[j] = c;\n\
147  }\n\
148  return vec4(echantillon[4].rgb, 1.0);\n\
149  }\n\
150  void main(void) {\n\
151  fragColor = median();\n\
152  }";
154  gl4duAtExit(quit);
155  }
156 }

Références _medianPId, _tempTexId, gl4dfBasicVS, gl4duAtExit(), gl4duCreateProgram(), et quit().

Référencé par medianfinit().

◆ medianffunc()

static void medianffunc ( GLuint  in,
GLuint  out,
GLuint  nb_iterations,
GLboolean  flipV 
)
static
34  {
35  GLuint rout = out, fbo, flipflop[2];
36  GLint vp[4], w, h, cfbo, ctex, cpId;
37  GLuint i;
38  GLboolean dt = glIsEnabled(GL_DEPTH_TEST), bl = glIsEnabled(GL_BLEND);
39 #ifndef __GLES4D__
40  GLint polygonMode[2];
41  glGetIntegerv(GL_POLYGON_MODE, polygonMode);
42 #endif
43  glGetIntegerv(GL_VIEWPORT, vp);
44  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &cfbo);
45  glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
46  glGetIntegerv(GL_CURRENT_PROGRAM, &cpId);
47  if(in == 0) { /* Pas d'entrée, donc l'entrée est le dernier draw */
48  fcommMatchTex(in = _tempTexId[0], 0);
50  } else if(in == out) {
51  fcommMatchTex(in = _tempTexId[0], out);
52  gl4dfConvTex2Tex(out, _tempTexId[0], GL_FALSE);
53  }
54  if(out == 0) { /* Pas de sortie, donc sortie aux dimensions du viewport */
55  w = vp[2];// - vp[0];
56  h = vp[3];// - vp[1];
57  fcommMatchTex(rout = _tempTexId[1], out);
58  } else {
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);
62  }
63  fcommMatchTex(_tempTexId[2], rout);
64  flipflop[!(nb_iterations&1)] = rout;
65  flipflop[nb_iterations&1] = _tempTexId[2];
66 #ifndef __GLES4D__
67  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
68 #endif
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) };
75  glUseProgram(_medianPId);
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);
85  }
86  glBindTexture(GL_TEXTURE_2D, 0);
87  }
88 
89  if(!out) { /* Copier à l'écran en cas de out nul */
90  glUseProgram(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);
93  }
94  glViewport(vp[0], vp[1], vp[2], vp[3]);
95  glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)cfbo);
96  glUseProgram(cpId);
97 #ifndef __GLES4D__
98  glPolygonMode(GL_FRONT_AND_BACK, polygonMode[0]);
99 #endif
100  if(bl) glEnable(GL_BLEND);
101  if(dt) glEnable(GL_DEPTH_TEST);
102  glDeleteFramebuffers(1, &fbo);
103 }

Références _medianPId, _tempTexId, fcommGetPlane(), fcommMatchTex(), gl4dfConvFrame2Tex(), gl4dfConvTex2Tex(), gl4dgDraw(), et in().

Référencé par medianfinit().

◆ medianfinit()

static void medianfinit ( GLuint  in,
GLuint  out,
GLuint  nb_iterations,
GLboolean  flipV 
)
static
27  {
28  init();
29  medianfptr = medianffunc;
30  medianfptr(in, out, nb_iterations, flipV);
31 }

Références in(), init(), et medianffunc().

Référencé par quit().

◆ MKFWINIT4()

MKFWINIT4 ( median  ,
void  ,
GLuint  ,
GLuint  ,
GLuint  ,
GLboolean   
)

◆ quit()

static void quit ( void  )
static
158  {
159  if(_tempTexId[0]) {
160  glDeleteTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
161  _tempTexId[0] = 0;
162  }
163  _medianPId = 0;
164  medianfptr = medianfinit;
165 }

Références _medianPId, _tempTexId, et medianfinit().

Référencé par init().

Documentation des variables

◆ _medianPId

GLuint _medianPId = 0
static

Référencé par init(), medianffunc(), et quit().

◆ _tempTexId

GLuint _tempTexId[3] = {0}
static

Référencé par init(), medianffunc(), et quit().

gl4dfBasicVS
static const char * gl4dfBasicVS
Definition: gl4dfCommon.h:22
in
static int in(void *func, void **funcList, int n)
regarde si le pointeur func est un élément du tableau funcList
Definition: gl4dhAnimeManager.c:143
quit
static void quit(void)
Definition: gl4dfMedian.c:158
gl4dfConvTex2Tex
GL4DAPI void GL4DAPIENTRY gl4dfConvTex2Tex(GLuint in, GLuint out, GLboolean flipV)
Copie la texture identifiée par in dans out. Le mode d'interpolation (par défaut GL_NEAREST) est à re...
Definition: gl4dfConversion.c:72
gl4dgDraw
void gl4dgDraw(GLuint id)
Dessine un objet-géométrie dont l'identifiant (référence) est passé en argument.
Definition: gl4dg.c:451
_tempTexId
static GLuint _tempTexId[3]
Definition: gl4dfMedian.c:15
gl4duAtExit
void gl4duAtExit(void(*func)(void))
ajoute func dans la liste des fonctions à appeler lors du gl4duClean avec l'argument GL4DU_AT_EXIT ou...
Definition: gl4du.c:616
fcommMatchTex
void fcommMatchTex(GLuint goal, GLuint orig)
Definition: gl4dfCommon.c:45
gl4dfConvFrame2Tex
GL4DAPI void GL4DAPIENTRY gl4dfConvFrame2Tex(GLuint *out)
Envoie le framebuffer actif (ou l'écran) vers une texture.
Definition: gl4dfConversion.c:21
_medianPId
static GLuint _medianPId
Definition: gl4dfMedian.c:15
medianfinit
static void medianfinit(GLuint in, GLuint out, GLuint nb_iterations, GLboolean flipV)
Definition: gl4dfMedian.c:27
gl4duCreateProgram
GLuint gl4duCreateProgram(const char *firstone,...)
créé un program à partir d'une liste (variable) de nom de fichiers shaders et renvoie l'identifiant o...
Definition: gl4du.c:368
init
static void init(void)
Definition: gl4dfMedian.c:105
medianffunc
static void medianffunc(GLuint in, GLuint out, GLuint nb_iterations, GLboolean flipV)
Definition: gl4dfMedian.c:34
fcommGetPlane
GLuint fcommGetPlane(void)
Definition: gl4dfCommon.c:65