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

filre de dispersion des pixels à partir d'une texture ou l'écran vers une texture ou l'écran. Plus de détails...

#include <stdlib.h>
#include <assert.h>
#include "gl4du.h"
#include "gl4df.h"
#include "gl4dfCommon.h"
Graphe des dépendances par inclusion de gl4dfScattering.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 (scattering, void, GLuint, GLuint, GLuint, GLuint, GLuint, GLboolean)
 
void gl4dfScattering (GLuint in, GLuint out, GLuint radius, GLuint displacementmap, GLuint weightmap, GLboolean flipV)
 Filtre 2D de mélange de pixels (éparpillement) Plus de détails...
 
void gl4dfScatteringChange (void)
 Force le changement de la carte de mélange (éparpillement) utilisée. Plus de détails...
 
static void scatteringfinit (GLuint in, GLuint out, GLuint radius, GLuint displacementmap, GLuint weightmap, GLboolean flipV)
 
static void scatteringffunc (GLuint in, GLuint out, GLuint radius, GLuint displacementmap, GLuint weightmap, GLboolean flipV)
 

Variables

static GLuint _scatteringPId = 0
 
static GLuint _width = 1
 
static GLuint _height = 1
 
static GLuint _noiseTex = 0
 
static GLuint _tempTexId [2] = {0}
 

Description détaillée

filre de dispersion des pixels à 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 09, 2017

Définition dans le fichier gl4dfScattering.c.

Documentation des fonctions

◆ gl4dfScattering()

void gl4dfScattering ( GLuint  in,
GLuint  out,
GLuint  radius,
GLuint  displacementmap,
GLuint  weightmap,
GLboolean  flipV 
)

Filtre 2D de mélange de pixels (éparpillement)

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 de l'éparpillement autour de chaque pixel.
displacementmapidentifiant de texture (niveaux de gris) à utiliser pour le suivi du bruit (éviter le showerdoor effect). Si 0, aucune texture de deplacement n'est utilisée.
weightmapidentifiant de texture (niveaux de gris) à utiliser pour pondérer le rayon d'éparpillement. Si 0, aucune pondération n'est appliquée.
flipVindique s'il est nécessaire d'effectuer un mirroir vertical du résultat.
24  {
25  scatteringfptr(in, out, radius, displacementmap, weightmap, flipV);
26 }

Références in().

◆ gl4dfScatteringChange()

void gl4dfScatteringChange ( void  )

Force le changement de la carte de mélange (éparpillement) utilisée.

28  {
29  init();
30 }

Références init().

◆ init()

static void init ( void  )
static
124  {
125  GLint vp[4], ctex;
126  long unsigned int i;
127  glGetIntegerv(GL_VIEWPORT, vp);
128  glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
129  if(!_tempTexId[0])
130  glGenTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
131  for(i = 0; i < (sizeof _tempTexId / sizeof *_tempTexId); ++i) {
132  glBindTexture(GL_TEXTURE_2D, _tempTexId[i]);
133  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
134  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
135  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
136  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
137  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
138  }
139  glBindTexture(GL_TEXTURE_2D, ctex);
140  if(!_scatteringPId) {
141  const char * imfs =
142  "<imfs>gl4df_scattering.fs</imfs>\n"
143 #ifdef __GLES4D__
144  "#version 300 es\n"
145 #else
146  "#version 330\n"
147 #endif
148  "precision mediump float;\n\
149  uniform sampler2D myTexture;\n\
150  uniform sampler2D wmTexture;\n\
151  uniform sampler2D noiseTexture;\n\
152  uniform sampler2D dmTexture;\n\
153  uniform vec2 delta;\n\
154  uniform int width, height, useWM, useDM;\n\
155  in vec2 vsoTexCoord;\n\
156  out vec4 fragColor;\n\
157  vec2 decale(vec2 st) {\n\
158  if(useDM == 0)\n\
159  return delta * texture(noiseTexture, st).rg;\n\
160  return delta * texture(noiseTexture, st + texture(dmTexture, st).rg).rg;\n\
161  }\n\
162  void main(void) {\n\
163  if(useWM == 0) {\n\
164  fragColor = texture(myTexture, vsoTexCoord.st + decale(vsoTexCoord.st));\n\
165  } else {\n\
166  vec4 wm = clamp(2.0 * (vec4(1.0) - texture(wmTexture, vsoTexCoord.st)) - vec4(1.0), 0.0, 1.0);\n\
167  fragColor = texture(myTexture, vsoTexCoord.st + wm.r * 3.0 * decale(vsoTexCoord.st));\n\
168  }\n\
169  }";
171  }
172  if(!_noiseTex) {
173  glGenTextures(1, &_noiseTex);
174  gl4duAtExit(quit);
175  }
176  setDimensions(vp[2]/* - vp[0]*/, vp[3]/* - vp[1]*/);
177 }

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

Référencé par gl4dfScatteringChange(), et scatteringfinit().

◆ MKFWINIT6()

MKFWINIT6 ( scattering  ,
void  ,
GLuint  ,
GLuint  ,
GLuint  ,
GLuint  ,
GLuint  ,
GLboolean   
)

◆ quit()

static void quit ( void  )
static
197  {
198  if(_tempTexId[0]) {
199  glDeleteTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
200  _tempTexId[0] = 0;
201  }
202  if(_noiseTex) {
203  glDeleteTextures(1, &_noiseTex);
204  _noiseTex = 0;
205  scatteringfptr = scatteringfinit;
206  }
207  _scatteringPId = 0;
208 }

Références _noiseTex, _scatteringPId, _tempTexId, et scatteringfinit().

Référencé par init().

◆ scatteringffunc()

static void scatteringffunc ( GLuint  in,
GLuint  out,
GLuint  radius,
GLuint  displacementmap,
GLuint  weightmap,
GLboolean  flipV 
)
static
38  {
39  GLuint rout = out, fbo;
40  GLint vp[4], w, h, cfbo, ctex, cpId;
41  GLboolean dt = glIsEnabled(GL_DEPTH_TEST), bl = glIsEnabled(GL_BLEND);
42 #ifndef __GLES4D__
43  GLint polygonMode[2];
44  glGetIntegerv(GL_POLYGON_MODE, polygonMode);
45 #endif
46  glGetIntegerv(GL_VIEWPORT, vp);
47  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &cfbo);
48  glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
49  glGetIntegerv(GL_CURRENT_PROGRAM, &cpId);
50  if(in == 0) { /* Pas d'entrée, donc l'entrée est le dernier draw */
51  fcommMatchTex(in = _tempTexId[0], 0);
53  } else if(in == out) {
54  fcommMatchTex(in = _tempTexId[0], out);
55  gl4dfConvTex2Tex(out, _tempTexId[0], GL_FALSE);
56  }
57  if(out == 0) { /* Pas de sortie, donc sortie aux dimensions du viewport */
58  w = vp[2];// - vp[0];
59  h = vp[3];// - vp[1];
60  fcommMatchTex(rout = _tempTexId[1], out);
61  } else {
62  glBindTexture(GL_TEXTURE_2D, out);
63  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
64  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
65  }
66  if((GLuint)w != _width || (GLuint)h != _height)
67  setDimensions(w, h);
68 #ifndef __GLES4D__
69  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
70 #endif
71  if(dt) glDisable(GL_DEPTH_TEST);
72  if(bl) glDisable(GL_BLEND);
73  glViewport(0, 0, w, h);
74  glGenFramebuffers(1, &fbo);
75  glBindFramebuffer(GL_FRAMEBUFFER, fbo); {
76  GLfloat d[] = {radius / (GLfloat)_width, radius / (GLfloat)_height};
77  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rout, 0);
78  glUseProgram(_scatteringPId);
79  glUniform1i(glGetUniformLocation(_scatteringPId, "myTexture"), 0);
80  glUniform1i(glGetUniformLocation(_scatteringPId, "noiseTexture"), 1);
81  glUniform1i(glGetUniformLocation(_scatteringPId, "wmTexture"), 2);
82  glUniform1i(glGetUniformLocation(_scatteringPId, "dmTexture"), 3);
83  glUniform1i(glGetUniformLocation(_scatteringPId, "useWM"), weightmap);
84  glUniform1i(glGetUniformLocation(_scatteringPId, "useDM"), displacementmap);
85  glUniform1i(glGetUniformLocation(_scatteringPId, "inv"), flipV);
86  glUniform1i(glGetUniformLocation(_scatteringPId, "width"), _width);
87  glUniform1i(glGetUniformLocation(_scatteringPId, "height"), _height);
88  glUniform2fv(glGetUniformLocation(_scatteringPId, "delta"), 1, d);
89 
90  glActiveTexture(GL_TEXTURE0);
91  glBindTexture(GL_TEXTURE_2D, in);
92  glActiveTexture(GL_TEXTURE1);
93  glBindTexture(GL_TEXTURE_2D, _noiseTex);
94  glActiveTexture(GL_TEXTURE2);
95  glBindTexture(GL_TEXTURE_2D, weightmap);
96  glActiveTexture(GL_TEXTURE3);
97  glBindTexture(GL_TEXTURE_2D, displacementmap);
99  glActiveTexture(GL_TEXTURE3);
100  glBindTexture(GL_TEXTURE_2D, 0);
101  glActiveTexture(GL_TEXTURE2);
102  glBindTexture(GL_TEXTURE_2D, 0);
103  glActiveTexture(GL_TEXTURE1);
104  glBindTexture(GL_TEXTURE_2D, 0);
105  glActiveTexture(GL_TEXTURE0);
106  glBindTexture(GL_TEXTURE_2D, 0);
107  }
108  if(!out) { /* Copier à l'écran en cas de out nul */
109  glUseProgram(0);
110  glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
111  glBlitFramebuffer(0, 0, _width, _height, vp[0], vp[1], vp[0] + vp[2], vp[1] + vp[3], GL_COLOR_BUFFER_BIT, GL_LINEAR);
112  }
113  glViewport(vp[0], vp[1], vp[2], vp[3]);
114  glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)cfbo);
115  glUseProgram(cpId);
116 #ifndef __GLES4D__
117  glPolygonMode(GL_FRONT_AND_BACK, polygonMode[0]);
118 #endif
119  if(bl) glEnable(GL_BLEND);
120  if(dt) glEnable(GL_DEPTH_TEST);
121  glDeleteFramebuffers(1, &fbo);
122 }

Références _height, _noiseTex, _scatteringPId, _tempTexId, _width, fcommGetPlane(), fcommMatchTex(), gl4dfConvFrame2Tex(), gl4dfConvTex2Tex(), gl4dgDraw(), in(), et setDimensions().

Référencé par scatteringfinit().

◆ scatteringfinit()

static void scatteringfinit ( GLuint  in,
GLuint  out,
GLuint  radius,
GLuint  displacementmap,
GLuint  weightmap,
GLboolean  flipV 
)
static
32  {
33  init();
34  scatteringfptr = scatteringffunc;
35  scatteringfptr(in, out, radius, displacementmap, weightmap, flipV);
36 }

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

Référencé par quit().

◆ setDimensions()

static void setDimensions ( GLuint  w,
GLuint  h 
)
static
179  {
180  unsigned int i;
181  GLfloat * noise = NULL;
182  _width = w;
183  _height = h;
184  noise = malloc(2 * _width * _height * sizeof *noise);
185  assert(noise);
186  for(i = 0; i < 2 * _width * _height; i++)
187  noise[i] = gl4dmSURand();
188  glBindTexture(GL_TEXTURE_2D, _noiseTex);
189  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
190  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
191  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
192  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
193  glTexImage2D(GL_TEXTURE_2D, 0, GL_RG, _width, _height, 0, GL_RG, GL_FLOAT, noise);
194  free(noise);
195 }

Références _height, _noiseTex, _width, et gl4dmSURand().

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

Documentation des variables

◆ _height

GLuint _height = 1
static

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

◆ _noiseTex

GLuint _noiseTex = 0
static

◆ _scatteringPId

GLuint _scatteringPId = 0
static

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

◆ _tempTexId

GLuint _tempTexId[2] = {0}
static

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

◆ _width

GLuint _width = 1
static

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

init
static void init(void)
Definition: gl4dfScattering.c:124
setDimensions
static void setDimensions(GLuint w, GLuint h)
Definition: gl4dfScattering.c:179
gl4dfBasicVS
static const char * gl4dfBasicVS
Definition: gl4dfCommon.h:22
gl4dmSURand
double gl4dmSURand(void)
Retourne un nombre pseudo-aleatoire dans l'intervalle [-1, 1[. Ici la distribution est uniforme.
Definition: gl4dm.c:28
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
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
scatteringfinit
static void scatteringfinit(GLuint in, GLuint out, GLuint radius, GLuint displacementmap, GLuint weightmap, GLboolean flipV)
Definition: gl4dfScattering.c:32
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
_width
static GLuint _width
Definition: gl4dfScattering.c:16
scatteringffunc
static void scatteringffunc(GLuint in, GLuint out, GLuint radius, GLuint displacementmap, GLuint weightmap, GLboolean flipV)
Definition: gl4dfScattering.c:38
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
_scatteringPId
static GLuint _scatteringPId
Definition: gl4dfScattering.c:16
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: gl4dfScattering.c:197
_height
static GLuint _height
Definition: gl4dfScattering.c:16
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
fcommGetPlane
GLuint fcommGetPlane(void)
Definition: gl4dfCommon.c:65
_noiseTex
static GLuint _noiseTex
Definition: gl4dfScattering.c:16
_tempTexId
static GLuint _tempTexId[2]
Definition: gl4dfScattering.c:16