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

filre réalisant un flou à 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"
#include "gl4dfBlurWeights.h"
Graphe des dépendances par inclusion de gl4dfBlur.c:

Aller au code source de ce fichier.

Fonctions

static void init (void)
 
static void setDimensions (GLuint w, GLuint h)
 
static void quit (void)
 
 MKFWINIT6 (blur, void, GLuint, GLuint, GLuint, GLuint, GLuint, GLboolean)
 
void gl4dfBlurSetWeightMapComponent (GLuint weightMapComponent)
 Indique la composante R (=0), G (=1), B (=2) ou A (=3) à utiliser dans la weight map. Plus de détails...
 
void gl4dfBlurSetWeightMapTranslate (GLfloat weightMapTranslate)
 Indique la translation de la valeur appliquée depuis la weight map. Plus de détails...
 
void gl4dfBlurSetWeightMapScale (GLfloat weightMapScale)
 Indique le scale de la valeur appliquée depuis la weight map. Plus de détails...
 
void gl4dfBlur (GLuint in, GLuint out, GLuint radius, GLuint nb_iterations, GLuint weight, GLboolean flipV)
 Filtre 2D de flou Gaussien. Plus de détails...
 
static void blurfinit (GLuint in, GLuint out, GLuint radius, GLuint nb_iterations, GLuint weight, GLboolean flipV)
 
static void blurffunc (GLuint in, GLuint out, GLuint radius, GLuint nb_iterations, GLuint weight, GLboolean flipV)
 

Variables

static GLuint _blurPId = 0
 
static GLuint _width = 1
 
static GLuint _height = 1
 
static GLuint _weightMapComponent = 0
 
static GLuint _tempTexId [3] = {0}
 
static GLfloat _offsetV [BLUR_MAX_RADIUS<< 1]
 
static GLfloat _offsetH [BLUR_MAX_RADIUS<< 1]
 
static GLfloat _weightMapTranslate = 0
 
static GLfloat _weightMapScale = 1
 

Description détaillée

filre réalisant un flou à 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 gl4dfBlur.c.

Documentation des fonctions

◆ blurffunc()

static void blurffunc ( GLuint  in,
GLuint  out,
GLuint  radius,
GLuint  nb_iterations,
GLuint  weight,
GLboolean  flipV 
)
static
52  {
53  GLuint rout = out, fbo;
54  GLint i, n, vp[4], w, h, cfbo, ctex, cpId;
55  GLboolean dt = glIsEnabled(GL_DEPTH_TEST), bl = glIsEnabled(GL_BLEND);
56 #ifndef __GLES4D__
57  GLint polygonMode[2];
58  glGetIntegerv(GL_POLYGON_MODE, polygonMode);
59 #endif
60  glGetIntegerv(GL_VIEWPORT, vp);
61  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &cfbo);
62  glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
63  glGetIntegerv(GL_CURRENT_PROGRAM, &cpId);
64 
65  if(in == 0) { /* Pas d'entrée, donc l'entrée est le dernier draw */
66  fcommMatchTex(in = _tempTexId[0], 0);
68  }
69  if(out == 0) { /* Pas de sortie, donc sortie aux dimensions du viewport */
70 
71  w = vp[2];// - vp[0];
72  h = vp[3];// - vp[1];
73  fcommMatchTex(rout = _tempTexId[1], out);
74  } else {
75  glBindTexture(GL_TEXTURE_2D, out);
76  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
77  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
78  }
79  if((GLuint)w != _width || (GLuint)h != _height)
80  setDimensions(w, h);
81  fcommMatchTex(_tempTexId[2], rout);
82 
83 #ifndef __GLES4D__
84  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
85 #endif
86  if(dt) glDisable(GL_DEPTH_TEST);
87  if(bl) glDisable(GL_BLEND);
88  glViewport(0, 0, _width, _height);
89  radius = radius > BLUR_MAX_RADIUS ? BLUR_MAX_RADIUS : radius;
90  glUseProgram(_blurPId);
91  glUniform1i(glGetUniformLocation(_blurPId, "myTexture"), 0);
92  glUniform1i(glGetUniformLocation(_blurPId, "myWeights"), 1);
93  glUniform1i(glGetUniformLocation(_blurPId, "useWeightMap"), weight ? 1 : 0);
94  glUniform1i(glGetUniformLocation(_blurPId, "weightMapComponent"), _weightMapComponent);
95  glUniform1f(glGetUniformLocation(_blurPId, "weightMapTranslate"), _weightMapTranslate);
96  glUniform1f(glGetUniformLocation(_blurPId, "weightMapScale"), _weightMapScale);
97  glUniform1fv(glGetUniformLocation(_blurPId, "weight"), BLUR_MAX_RADIUS, &weights[(radius * (radius - 1)) >> 1]);
98  glUniform1i(glGetUniformLocation(_blurPId, "nweights"), radius);
99  glGenFramebuffers(1, &fbo);
100  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
101  for(n = 0; n < (int)nb_iterations; n++) {
102  for(i = 0; i < 2; i++) {
103  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, i == 0 ? _tempTexId[2] : rout, 0);
104  glUniform1i(glGetUniformLocation(_blurPId, "inv"), i ? flipV : 0);
105  glUniform2fv(glGetUniformLocation(_blurPId, "offset"), BLUR_MAX_RADIUS, (i % 2) ? _offsetH : _offsetV);
106  glActiveTexture(GL_TEXTURE0);
107  glBindTexture(GL_TEXTURE_2D, i == 0 ? in : _tempTexId[2]);
108  glActiveTexture(GL_TEXTURE1);
109  glBindTexture(GL_TEXTURE_2D, weight);
111  glActiveTexture(GL_TEXTURE1);
112  glBindTexture(GL_TEXTURE_2D, 0);
113  glActiveTexture(GL_TEXTURE0);
114  glBindTexture(GL_TEXTURE_2D, 0);
115  }
116  in = rout;
117  }
118  if(!out) { /* Copier à l'écran en cas de out nul */
119  glUseProgram(0);
120  glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
121  glBlitFramebuffer(0, 0, _width, _height, vp[0], vp[1], vp[0] + vp[2], vp[1] + vp[3], GL_COLOR_BUFFER_BIT, GL_LINEAR);
122  }
123  glViewport(vp[0], vp[1], vp[2], vp[3]);
124  glBindFramebuffer(GL_FRAMEBUFFER, cfbo);
125  glBindTexture(GL_TEXTURE_2D, ctex);
126  glUseProgram(cpId);
127 #ifndef __GLES4D__
128  glPolygonMode(GL_FRONT_AND_BACK, polygonMode[0]);
129 #endif
130  if(bl) glEnable(GL_BLEND);
131  if(dt) glEnable(GL_DEPTH_TEST);
132  glDeleteFramebuffers(1, &fbo);
133 }

Références _blurPId, _height, _offsetH, _offsetV, _tempTexId, _weightMapComponent, _weightMapScale, _weightMapTranslate, _width, BLUR_MAX_RADIUS, fcommGetPlane(), fcommMatchTex(), gl4dfConvFrame2Tex(), gl4dgDraw(), in(), setDimensions(), et weights.

Référencé par blurfinit().

◆ blurfinit()

static void blurfinit ( GLuint  in,
GLuint  out,
GLuint  radius,
GLuint  nb_iterations,
GLuint  weight,
GLboolean  flipV 
)
static
45  {
46  init();
47  blurfptr = blurffunc;
48  blurfptr(in, out, radius, nb_iterations, weight, flipV);
49 }

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

Référencé par quit().

◆ gl4dfBlur()

void gl4dfBlur ( GLuint  in,
GLuint  out,
GLuint  radius,
GLuint  nb_iterations,
GLuint  weight,
GLboolean  flipV 
)

Filtre 2D de flou Gaussien.

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.
radiusrayon du masque de convolution Gaussien à appliquer (de 0 à 128).
nb_iterationsle nombre d'itérations de flou.
weightidentifiant de texture (niveaux de gris) à utiliser pour pondérer le rayon de flou. Si 0, aucune pondération n'est appliquée.
flipVindique s'il est nécessaire d'effectuer un mirroir vertical du résultat.
40  {
41  blurfptr(in, out, radius, nb_iterations, weight, flipV);
42 }

Références in().

◆ gl4dfBlurSetWeightMapComponent()

void gl4dfBlurSetWeightMapComponent ( GLuint  weightMapComponent)

Indique la composante R (=0), G (=1), B (=2) ou A (=3) à utiliser dans la weight map.

Paramètres
weightMapComponentle numéro de la composante : 0, 1, 2 ou
  1. La valeur par défaut est 0.
28  {
29  _weightMapComponent = weightMapComponent % 4;
30 }

Références _weightMapComponent.

◆ gl4dfBlurSetWeightMapScale()

void gl4dfBlurSetWeightMapScale ( GLfloat  weightMapScale)

Indique le scale de la valeur appliquée depuis la weight map.

Paramètres
weightMapScalele scale à appliquer.
36  {
37  _weightMapScale = weightMapScale;
38 }

Références _weightMapScale.

◆ gl4dfBlurSetWeightMapTranslate()

void gl4dfBlurSetWeightMapTranslate ( GLfloat  weightMapTranslate)

Indique la translation de la valeur appliquée depuis la weight map.

Paramètres
weightMapTranslatela translation à appliquer.
32  {
33  _weightMapTranslate = weightMapTranslate;
34 }

Références _weightMapTranslate.

◆ init()

static void init ( void  )
static
135  {
136  GLint vp[4], ctex;
137  GLuint i;
138  glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
139  if(!_tempTexId[0])
140  glGenTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
141  for(i = 0; i < (sizeof _tempTexId / sizeof *_tempTexId); ++i) {
142  glBindTexture(GL_TEXTURE_2D, _tempTexId[i]);
143  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
144  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
145  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
146  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
147  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
148  }
149  glBindTexture(GL_TEXTURE_2D, ctex);
150  glGetIntegerv(GL_VIEWPORT, vp);
151  if(!_blurPId) {
152  const char * imfs =
153  "<imfs>gl4df_blur1D.fs</imfs>\n"
154 #ifdef __GLES4D__
155  "#version 300 es\n"
156 #else
157  "#version 330\n"
158 #endif
159  "uniform sampler2D myTexture;\n \
160  uniform sampler2D myWeights;\n \
161  uniform int nweights, useWeightMap, weightMapComponent;\n \
162  uniform float weight[128], weightMapTranslate, weightMapScale;\n \
163  uniform vec2 offset[128];\n \
164  in vec2 vsoTexCoord;\n \
165  out vec4 fragColor;\n \
166  vec4 uniformBlur(void) {\n \
167  vec4 c = texture(myTexture, vsoTexCoord.st) * weight[0];\n \
168  for (int i = 1; i < nweights; i++) {\n \
169  c += texture(myTexture, vsoTexCoord.st + offset[i]) * weight[i];\n \
170  c += texture(myTexture, vsoTexCoord.st - offset[i]) * weight[i];\n \
171  }\n \
172  return c;\n \
173  }\n \
174  vec4 weightedBlur(void) {\n \
175  float w = texture(myWeights, vsoTexCoord.st)[weightMapComponent];\n \
176  int sub_nweights = 1 + int(float(nweights) * clamp(weightMapScale * w + weightMapTranslate, 0.0, 1.0));\n \
177  vec4 c = texture(myTexture, vsoTexCoord.st) * (w = weight[0]);\n \
178  for (int i = 1; i < sub_nweights; i++) {\n \
179  w += 2.0 * weight[i];\n \
180  }\n \
181  for (int i = 1; i < sub_nweights; i++) {\n \
182  c += texture(myTexture, vsoTexCoord.st + offset[i]) * weight[i];\n \
183  c += texture(myTexture, vsoTexCoord.st - offset[i]) * weight[i];\n \
184  }\n \
185  return c / w;\n \
186  }\n \
187  void main(void) {\n \
188  fragColor = ((useWeightMap != 0) ? weightedBlur() : uniformBlur());\n \
189  }";
191  gl4duAtExit(quit);
192  }
193  if(_tempTexId[0])
194  setDimensions(vp[2]/* - vp[0]*/, vp[3]/* - vp[1]*/);
195 }

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

Référencé par blurfinit().

◆ MKFWINIT6()

MKFWINIT6 ( blur  ,
void  ,
GLuint  ,
GLuint  ,
GLuint  ,
GLuint  ,
GLuint  ,
GLboolean   
)

◆ quit()

static void quit ( void  )
static
208  {
209  if(_tempTexId[0]) {
210  glDeleteTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
211  _tempTexId[0] = 0;
212  }
213  _blurPId = 0;
214  blurfptr = blurfinit;
215 }

Références _blurPId, _tempTexId, et blurfinit().

Référencé par init().

◆ setDimensions()

static void setDimensions ( GLuint  w,
GLuint  h 
)
static
197  {
198  int i;
199  _width = w;
200  _height = h;
201  for(i = 0; i < BLUR_MAX_RADIUS; i++) {
202  _offsetH[(i << 1) + 0] = i / (GLfloat)_width;
203  _offsetV[(i << 1) + 1] = i / (GLfloat)_height;
204  _offsetH[(i << 1) + 1] = _offsetV[(i << 1) + 0] = 0.0;
205  }
206 }

Références _height, _offsetH, _offsetV, _width, et BLUR_MAX_RADIUS.

Référencé par blurffunc(), et init().

Documentation des variables

◆ _blurPId

GLuint _blurPId = 0
static

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

◆ _height

GLuint _height = 1
static

Référencé par blurffunc(), et setDimensions().

◆ _offsetH

GLfloat _offsetH[BLUR_MAX_RADIUS<< 1]
static

Référencé par blurffunc(), et setDimensions().

◆ _offsetV

GLfloat _offsetV[BLUR_MAX_RADIUS<< 1]
static

Référencé par blurffunc(), et setDimensions().

◆ _tempTexId

GLuint _tempTexId[3] = {0}
static

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

◆ _weightMapComponent

GLuint _weightMapComponent = 0
static

◆ _weightMapScale

GLfloat _weightMapScale = 1
static

◆ _weightMapTranslate

GLfloat _weightMapTranslate = 0
static

◆ _width

GLuint _width = 1
static

Référencé par blurffunc(), et setDimensions().

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[3]
Definition: gl4dfBlur.c:19
weights
static GLfloat weights[]
Definition: gl4dfBlurWeights.h:32
_blurPId
static GLuint _blurPId
Definition: gl4dfBlur.c:19
_width
static GLuint _width
Definition: gl4dfBlur.c:19
init
static void init(void)
Definition: gl4dfBlur.c:135
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
_offsetV
static GLfloat _offsetV[BLUR_MAX_RADIUS<< 1]
Definition: gl4dfBlur.c:20
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
blurfinit
static void blurfinit(GLuint in, GLuint out, GLuint radius, GLuint nb_iterations, GLuint weight, GLboolean flipV)
Definition: gl4dfBlur.c:45
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
quit
static void quit(void)
Definition: gl4dfBlur.c:208
_weightMapComponent
static GLuint _weightMapComponent
Definition: gl4dfBlur.c:19
_weightMapScale
static GLfloat _weightMapScale
Definition: gl4dfBlur.c:20
_offsetH
static GLfloat _offsetH[BLUR_MAX_RADIUS<< 1]
Definition: gl4dfBlur.c:20
blurffunc
static void blurffunc(GLuint in, GLuint out, GLuint radius, GLuint nb_iterations, GLuint weight, GLboolean flipV)
Definition: gl4dfBlur.c:52
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
_weightMapTranslate
static GLfloat _weightMapTranslate
Definition: gl4dfBlur.c:20
fcommGetPlane
GLuint fcommGetPlane(void)
Definition: gl4dfCommon.c:65
setDimensions
static void setDimensions(GLuint w, GLuint h)
Definition: gl4dfBlur.c:197
_height
static GLuint _height
Definition: gl4dfBlur.c:19
BLUR_MAX_RADIUS
#define BLUR_MAX_RADIUS
Definition: gl4dfBlurWeights.h:11