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

filre réalisant un sobel à partir d'une texture ou l'écran vers une texture ou l'écran. Plus de détails...

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "gl4du.h"
#include "gl4df.h"
#include "gl4dfCommon.h"
Graphe des dépendances par inclusion de gl4dfSobel.c:

Aller au code source de ce fichier.

Fonctions

static void init (void)
 
static void quit (void)
 
 MKFWINIT3 (sobel, void, GLuint, GLuint, GLboolean)
 
void gl4dfSobel (GLuint in, GLuint out, GLboolean flipV)
 Filtre 2D Sobel (détection des contours) Plus de détails...
 
void gl4dfSobelSetResultMode (GL4DFenum mode)
 Fonction liée au filtre Sobel. Méthode de calcul du résultat final du Sobel. Plus de détails...
 
void gl4dfSobelSetMixMode (GL4DFenum mode)
 Fonction liée au filtre Sobel. Méthode de combinaison du résultat final du Sobel avec l'image d'origine. Plus de détails...
 
void gl4dfSobelSetMixFactor (GLfloat factor)
 Fonction liée au filtre Sobel. Modification du facteur de mix utilisé par le mode GL4DF_SOBEL_MIX_ADD. Plus de détails...
 
static void sobelfinit (GLuint in, GLuint out, GLboolean flipV)
 
static void sobelffunc (GLuint in, GLuint out, GLboolean flipV)
 

Variables

static GLfloat _mixFactor = 0.5f
 
static GLuint _sobelPId = 0
 
static GLuint _mixMode = 0
 
static GLuint _tempTexId [2] = {0}
 
static GLboolean _isLuminance = GL_TRUE
 
static GLboolean _isInvert = GL_TRUE
 

Description détaillée

filre réalisant un sobel à 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
April 14, 2016

Définition dans le fichier gl4dfSobel.c.

Documentation des fonctions

◆ gl4dfSobel()

void gl4dfSobel ( GLuint  in,
GLuint  out,
GLboolean  flipV 
)

Filtre 2D Sobel (détection des contours)

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.
flipVindique s'il est nécessaire d'effectuer un mirroir vertical du résultat.
27  {
28  sobelfptr(in, out, flipV);
29 }

Références in().

◆ gl4dfSobelSetMixFactor()

void gl4dfSobelSetMixFactor ( GLfloat  factor)

Fonction liée au filtre Sobel. Modification du facteur de mix utilisé par le mode GL4DF_SOBEL_MIX_ADD.

Paramètres
factorfacteur de mélange compris entre 0 et 1
Voir également
gl4dfSobelSetMixMode
76  {
77  _mixFactor = factor;
78 }

Références _mixFactor.

◆ gl4dfSobelSetMixMode()

void gl4dfSobelSetMixMode ( GL4DFenum  mode)

Fonction liée au filtre Sobel. Méthode de combinaison du résultat final du Sobel avec l'image d'origine.

Paramètres
modeindique les différents modes possibles. Plusieurs choix sont disponibles:
  • GL4DF_SOBEL_MIX_NONE : le Sobel est seul ;
  • GL4DF_SOBEL_MIX_ADD : le Sobel est pondéré et additionné à l'image d'origine (utilise la fonction GLSL mix). Le facteur de pondération est fixé par gl4dfSobelSetMixFactor;
  • GL4DF_SOBEL_MIX_MULT : le Sobel est multiplié par l'image d'origine.
59  {
60  switch(mode) {
62  _mixMode = 0;
63  break;
65  _mixMode = 1;
66  break;
68  _mixMode = 2;
69  break;
70  default:
71  fprintf(stderr, "%s: this value (%d) has no effect\n", __func__, mode);
72  break;
73  }
74 }

Références _mixMode, GL4DF_SOBEL_MIX_ADD, GL4DF_SOBEL_MIX_MULT, et GL4DF_SOBEL_MIX_NONE.

◆ gl4dfSobelSetResultMode()

void gl4dfSobelSetResultMode ( GL4DFenum  mode)

Fonction liée au filtre Sobel. Méthode de calcul du résultat final du Sobel.

Paramètres
modeindique les différents modes possibles. Plusieurs choix sont disponibles:
  • GL4DF_SOBEL_RESULT_RGB : le résultat du Sobel est laissé inchangé (chaque composante contien son Sobel) ;
  • GL4DF_SOBEL_RESULT_INV_RGB : idem que la précédente avec une inversion (1.0 - s) ;
  • GL4DF_SOBEL_RESULT_LUMINANCE : le résultat est transformé en Luminance sur les 3 composantes ;
  • GL4DF_SOBEL_RESULT_INV_LUMINANCE : mode par défault, le résultat est l'inverse de la Luminance sur les 3 composantes.
35  {
36  switch(mode) {
38  _isLuminance = GL_FALSE;
39  _isInvert = GL_FALSE;
40  break;
42  _isLuminance = GL_FALSE;
43  _isInvert = GL_TRUE;
44  break;
46  _isLuminance = GL_TRUE;
47  _isInvert = GL_FALSE;
48  break;
50  _isLuminance = GL_TRUE;
51  _isInvert = GL_TRUE;
52  break;
53  default:
54  fprintf(stderr, "%s: this value (%d) has no effect\n", __func__, mode);
55  break;
56  }
57 }

Références _isInvert, _isLuminance, GL4DF_SOBEL_RESULT_INV_LUMINANCE, GL4DF_SOBEL_RESULT_INV_RGB, GL4DF_SOBEL_RESULT_LUMINANCE, et GL4DF_SOBEL_RESULT_RGB.

◆ init()

static void init ( void  )
static
158  {
159  GLint ctex;
160  GLuint i;
161  glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
162  if(!_tempTexId[0])
163  glGenTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
164  for(i = 0; i < (sizeof _tempTexId / sizeof *_tempTexId); ++i) {
165  glBindTexture(GL_TEXTURE_2D, _tempTexId[i]);
166  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
167  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
168  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
169  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
170  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
171  }
172  glBindTexture(GL_TEXTURE_2D, ctex);
173  if(!_sobelPId) {
174  const char * imfs =
175  "<imfs>gl4df_sobel.fs</imfs>\n"
176 #ifdef __GLES4D__
177  "#version 300 es\n"
178 #else
179  "#version 330\n"
180 #endif
181  "uniform sampler2D myTexture;\n \
182  uniform vec2 step;\n \
183  uniform int width, height, invResult, luminance, mixMode;\n \
184  uniform float mixFactor;\n \
185  in vec2 vsoTexCoord;\n \
186  out vec4 fragColor;\n \
187  const int ossize = 9;\n \
188  const vec2 G[ossize] = vec2[]( vec2(1.0, 1.0), vec2(0.0, 2.0), vec2(-1.0, 1.0),\n \
189  vec2(2.0, 0.0), vec2(0.0, 0.0), vec2(-2.0, 0.0),\n \
190  vec2(1.0, -1.0), vec2(0.0, -2.0), vec2(-1.0, -1.0) );\n \
191  vec2 offset[ossize] = vec2[](vec2(-step.x , -step.y), vec2( 0.0, -step.y), vec2( step.x , -step.y),\n \
192  vec2(-step.x, 0.0), vec2( 0.0, 0.0), vec2( step.x, 0.0),\n \
193  vec2(-step.x, step.y), vec2( 0.0, step.y), vec2( step.x , step.y) );\n \
194  vec3 sobel(sampler2D s, vec2 c) {\n \
195  vec2 r = vec2(0.0, 0.0), g = vec2(0.0, 0.0), b = vec2(0.0, 0.0);\n \
196  for(int i = 0; i < ossize; i++) {\n \
197  r += texture(s, c + offset[i]).r * G[i];\n \
198  g += texture(s, c + offset[i]).g * G[i];\n \
199  b += texture(s, c + offset[i]).b * G[i];\n \
200  }\n \
201  return vec3(length(r), length(g), length(b));\n \
202  }\n \
203  void main(void) {\n \
204  vec4 c = texture(myTexture, vsoTexCoord);\n \
205  vec3 r = sobel(myTexture, vsoTexCoord);\n \
206  if(invResult != 0)\n \
207  r = vec3(1) - r;\n \
208  if(luminance != 0)\n \
209  r = vec3(dot(vec3(0.299, 0.587, 0.114), r));\n \
210  if(mixMode == 0)\n \
211  fragColor = vec4(r, c.a);\n \
212  else if(mixMode == 1)\n \
213  fragColor = vec4(mix(c.rgb, r, mixFactor), c.a);\n \
214  else\n \
215  fragColor = vec4(c.rgb * r, c.a);\n \
216  }";
218  gl4duAtExit(quit);
219  }
220 }

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

Référencé par sobelfinit().

◆ MKFWINIT3()

MKFWINIT3 ( sobel  ,
void  ,
GLuint  ,
GLuint  ,
GLboolean   
)

◆ quit()

static void quit ( void  )
static
222  {
223  if(_tempTexId[0]) {
224  glDeleteTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
225  _tempTexId[0] = 0;
226  }
227  _sobelPId = 0;
228  sobelfptr = sobelfinit;
229 }

Références _sobelPId, _tempTexId, et sobelfinit().

Référencé par init().

◆ sobelffunc()

static void sobelffunc ( GLuint  in,
GLuint  out,
GLboolean  flipV 
)
static
88  {
89  GLuint rout = out, fbo;
90  GLint vp[4], w, h, cfbo, ctex, cpId;
91  GLboolean dt = glIsEnabled(GL_DEPTH_TEST), bl = glIsEnabled(GL_BLEND);
92 #ifndef __GLES4D__
93  GLint polygonMode[2];
94  glGetIntegerv(GL_POLYGON_MODE, polygonMode);
95 #endif
96  glGetIntegerv(GL_VIEWPORT, vp);
97  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &cfbo);
98  glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
99  glGetIntegerv(GL_CURRENT_PROGRAM, &cpId);
100  if(in == 0) { /* Pas d'entrée, donc l'entrée est le dernier draw */
101  fcommMatchTex(in = _tempTexId[0], 0);
103  } else if(in == out) {
104  fcommMatchTex(in = _tempTexId[0], out);
105  gl4dfConvTex2Tex(out, _tempTexId[0], GL_FALSE);
106  }
107  if(out == 0) { /* Pas de sortie, donc sortie aux dimensions du viewport */
108  w = vp[2];// - vp[0];
109  h = vp[3];// - vp[1];
110  fcommMatchTex(rout = _tempTexId[1], out);
111  } else {
112  glBindTexture(GL_TEXTURE_2D, out);
113  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
114  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
115  }
116 #ifndef __GLES4D__
117  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
118 #endif
119  if(dt) glDisable(GL_DEPTH_TEST);
120  if(bl) glDisable(GL_BLEND);
121  glViewport(0, 0, w, h);
122  glGenFramebuffers(1, &fbo);
123  glBindFramebuffer(GL_FRAMEBUFFER, fbo); {
124  GLfloat step[] = {1.0f / (GLfloat)w, 1.0f / (GLfloat)h};
125  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rout, 0);
126  glUseProgram(_sobelPId);
127  glUniform1i(glGetUniformLocation(_sobelPId, "myTexture"), 0);
128  glUniform1i(glGetUniformLocation(_sobelPId, "inv"), flipV);
129  glUniform1i(glGetUniformLocation(_sobelPId, "width"), w);
130  glUniform1i(glGetUniformLocation(_sobelPId, "height"), h);
131  glUniform2fv(glGetUniformLocation(_sobelPId, "step"), 1, step);
132  /* glUniform4fv(glGetUniformLocation(_sobelPId, "color"), 1, _color); */
133  glUniform1i(glGetUniformLocation(_sobelPId, "invResult"), _isInvert);
134  glUniform1i(glGetUniformLocation(_sobelPId, "luminance"), _isLuminance);
135  glUniform1i(glGetUniformLocation(_sobelPId, "mixMode"), _mixMode);
136  glUniform1f(glGetUniformLocation(_sobelPId, "mixFactor"), _mixFactor);
137  glActiveTexture(GL_TEXTURE0);
138  glBindTexture(GL_TEXTURE_2D, in);
140  glBindTexture(GL_TEXTURE_2D, 0);
141  }
142  if(!out) { /* Copier à l'écran en cas de out nul */
143  glUseProgram(0);
144  glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
145  glBlitFramebuffer(0, 0, w, h, vp[0], vp[1], vp[0] + vp[2], vp[1] + vp[3], GL_COLOR_BUFFER_BIT, GL_LINEAR);
146  }
147  glViewport(vp[0], vp[1], vp[2], vp[3]);
148  glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)cfbo);
149  glUseProgram(cpId);
150 #ifndef __GLES4D__
151  glPolygonMode(GL_FRONT_AND_BACK, polygonMode[0]);
152 #endif
153  if(bl) glEnable(GL_BLEND);
154  if(dt) glEnable(GL_DEPTH_TEST);
155  glDeleteFramebuffers(1, &fbo);
156 }

Références _isInvert, _isLuminance, _mixFactor, _mixMode, _sobelPId, _tempTexId, fcommGetPlane(), fcommMatchTex(), gl4dfConvFrame2Tex(), gl4dfConvTex2Tex(), gl4dgDraw(), et in().

Référencé par sobelfinit().

◆ sobelfinit()

static void sobelfinit ( GLuint  in,
GLuint  out,
GLboolean  flipV 
)
static
81  {
82  init();
83  sobelfptr = sobelffunc;
84  sobelfptr(in, out, flipV);
85 }

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

Référencé par quit().

Documentation des variables

◆ _isInvert

GLboolean _isInvert = GL_TRUE
static

Référencé par gl4dfSobelSetResultMode(), et sobelffunc().

◆ _isLuminance

GLboolean _isLuminance = GL_TRUE
static

Référencé par gl4dfSobelSetResultMode(), et sobelffunc().

◆ _mixFactor

GLfloat _mixFactor = 0.5f
static

Référencé par gl4dfSobelSetMixFactor(), et sobelffunc().

◆ _mixMode

GLuint _mixMode = 0
static

Référencé par gl4dfSobelSetMixMode(), et sobelffunc().

◆ _sobelPId

GLuint _sobelPId = 0
static

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

◆ _tempTexId

GLuint _tempTexId[2] = {0}
static

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

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
_tempTexId
static GLuint _tempTexId[2]
Definition: gl4dfSobel.c:19
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
sobelffunc
static void sobelffunc(GLuint in, GLuint out, GLboolean flipV)
Definition: gl4dfSobel.c:88
GL4DF_SOBEL_MIX_ADD
@ GL4DF_SOBEL_MIX_ADD
Definition: gl4df.h:33
_sobelPId
static GLuint _sobelPId
Definition: gl4dfSobel.c:19
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
_mixFactor
static GLfloat _mixFactor
Definition: gl4dfSobel.c:18
_mixMode
static GLuint _mixMode
Definition: gl4dfSobel.c:19
GL4DF_SOBEL_RESULT_INV_RGB
@ GL4DF_SOBEL_RESULT_INV_RGB
Definition: gl4df.h:29
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
GL4DF_SOBEL_RESULT_INV_LUMINANCE
@ GL4DF_SOBEL_RESULT_INV_LUMINANCE
Definition: gl4df.h:31
GL4DF_SOBEL_MIX_NONE
@ GL4DF_SOBEL_MIX_NONE
Definition: gl4df.h:32
quit
static void quit(void)
Definition: gl4dfSobel.c:222
GL4DF_SOBEL_RESULT_LUMINANCE
@ GL4DF_SOBEL_RESULT_LUMINANCE
Definition: gl4df.h:30
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
GL4DF_SOBEL_RESULT_RGB
@ GL4DF_SOBEL_RESULT_RGB
Definition: gl4df.h:28
init
static void init(void)
Definition: gl4dfSobel.c:158
_isInvert
static GLboolean _isInvert
Definition: gl4dfSobel.c:20
sobelfinit
static void sobelfinit(GLuint in, GLuint out, GLboolean flipV)
Definition: gl4dfSobel.c:81
fcommGetPlane
GLuint fcommGetPlane(void)
Definition: gl4dfCommon.c:65
_isLuminance
static GLboolean _isLuminance
Definition: gl4dfSobel.c:20
GL4DF_SOBEL_MIX_MULT
@ GL4DF_SOBEL_MIX_MULT
Definition: gl4df.h:34