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

filre permettant de réaliser des opérations entre deux textures vers une troisième. 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 gl4dfOp.c:

Aller au code source de ce fichier.

Fonctions

static void init (void)
 
static void quit (void)
 
 MKFWINIT4 (op, void, GLuint, GLuint, GLuint, GLboolean)
 
void gl4dfOp (GLuint in1, GLuint in2, GLuint out, GLboolean flipV)
 Réalise un mélange entre deux textures (ou écran) en entrée et l'écrit dans une texture ou à l'écran en sortie. L'opération choisie pour le mélange est choisie à l'aide de la fonction gl4dfOpSetOp ; l'opération par défaut est l'addition avec la valeur GL4DF_OP_ADD. Plus de détails...
 
void gl4dfOpSetOp (GL4DFenum op)
 Permet de choisir l'opération pour le mélange effectué avec l'aide de la fonction gl4dfOp ; l'opération par défaut est l'addition avec la valeur GL4DF_OP_ADD. Plus de détails...
 
static void opfinit (GLuint in1, GLuint in2, GLuint out, GLboolean flipV)
 
static void opffunc (GLuint in1, GLuint in2, GLuint out, GLboolean flipV)
 

Variables

static const GLuint _op0 = GL4DF_OP_ADD
 
static GLuint _opPId = 0
 
static GLuint _op = GL4DF_OP_ADD
 
static GLuint _tempTexId [3] = { 0 }
 

Description détaillée

filre permettant de réaliser des opérations entre deux textures vers une troisième.

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

Définition dans le fichier gl4dfOp.c.

Documentation des fonctions

◆ gl4dfOp()

void gl4dfOp ( GLuint  in1,
GLuint  in2,
GLuint  out,
GLboolean  flipV 
)

Réalise un mélange entre deux textures (ou écran) en entrée et l'écrit dans une texture ou à l'écran en sortie. L'opération choisie pour le mélange est choisie à l'aide de la fonction gl4dfOpSetOp ; l'opération par défaut est l'addition avec la valeur GL4DF_OP_ADD.

Paramètres
in1identifiant de la première texture en entrée (peut être 0 si écran).
in2identifiant de la seconde texture en entrée (peut être 0 si écran).
outidentifiant de la texture de sortie (peut être 0 si écran).
flipVeffectuer un flip vertical si GL_TRUE.
26  {
27  opfptr(in1, in2, out, flipV);
28 }

◆ gl4dfOpSetOp()

void gl4dfOpSetOp ( GL4DFenum  op)

Permet de choisir l'opération pour le mélange effectué avec l'aide de la fonction gl4dfOp ; l'opération par défaut est l'addition avec la valeur GL4DF_OP_ADD.

Paramètres
opvaleur correspondant à l'opération qui sera effectuée. Peut être une parmi : GL4DF_OP_ADD (addition), GL4DF_OP_SUB (soustraction), GL4DF_OP_MULT (multiplication), GL4DF_OP_DIV (division), GL4DF_OP_OVERLAY (overlay).
30  {
31  _op = op;
32 }

Références _op.

◆ init()

static void init ( void  )
static
109  {
110  GLint ctex;
111  GLuint i;
112  glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
113  if(!_tempTexId[0])
114  glGenTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
115  for(i = 0; i < (sizeof _tempTexId / sizeof *_tempTexId); i++) {
116  glBindTexture(GL_TEXTURE_2D, _tempTexId[i]);
117  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
118  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
119  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
120  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
121  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
122  }
123  glBindTexture(GL_TEXTURE_2D, ctex);
124  if(!_opPId) {
125  const char * imfs =
126  "<imfs>gl4df_op.fs</imfs>\n"
127 #ifdef __GLES4D__
128  "#version 300 es\n"
129 #else
130  "#version 330\n"
131 #endif
132  "uniform sampler2D tex0, tex1;\n \
133  uniform int op;\n \
134  in vec2 vsoTexCoord;\n \
135  out vec4 fragColor;\n \
136  void main(void) {\n \
137  vec4 c0 = texture(tex0, vsoTexCoord);\n \
138  vec4 c1 = texture(tex1, vsoTexCoord);\n \
139  switch(op) {\n \
140  case 0: /* */\n \
141  fragColor = c0 + c1;\n \
142  break;\n \
143  case 1: /* */\n \
144  fragColor = c0 - c1;\n \
145  break;\n \
146  case 2: /* */\n \
147  fragColor = c0 * c1;\n \
148  break;\n \
149  case 3: /* */\n \
150  fragColor = c0 / c1;\n \
151  break;\n \
152  case 4: /* */\n \
153  fragColor = (length(c1) > 0.0) ? c1 : c0;\n \
154  break;\n \
155  default:\n \
156  fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n \
157  break;\n \
158  }\n \
159  }";
160  _opPId = gl4duCreateProgram(gl4dfBasicVS, imfs, NULL);
161  gl4duAtExit(quit);
162  }
163 }

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

Référencé par opfinit().

◆ MKFWINIT4()

MKFWINIT4 ( op  ,
void  ,
GLuint  ,
GLuint  ,
GLuint  ,
GLboolean   
)

◆ opffunc()

static void opffunc ( GLuint  in1,
GLuint  in2,
GLuint  out,
GLboolean  flipV 
)
static
42  {
43  GLuint fbo, rout = out;
44  GLint vp[4], w, h, cpId, cfbo, ctex;
45  GLboolean dt = glIsEnabled(GL_DEPTH_TEST), bl = glIsEnabled(GL_BLEND);
46 #ifndef __GLES4D__
47  GLint polygonMode[2];
48  glGetIntegerv(GL_POLYGON_MODE, polygonMode);
49 #endif
50  glGetIntegerv(GL_VIEWPORT, vp);
51  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &cfbo);
52  glGetIntegerv(GL_TEXTURE_BINDING_2D, &ctex);
53  glGetIntegerv(GL_CURRENT_PROGRAM, &cpId);
54 
55  /* vérifier toutes les dimensions */
56  if( out == 0 /* pas de sortie, donc la sortie est l'écran */ ||
57  (out == in1 || out == in2) /* ou une des entrées est la même que la sortie*/ )
58  fcommMatchTex(rout = _tempTexId[2], out);
59  if(in1 == 0) { /* Pas d'entrée 1, donc l'entrée est le dernier draw */
60  fcommMatchTex(in1 = _tempTexId[0], 0);
62  }
63  if(in2 == 0) { /* Pas d'entrée 2, donc l'entrée est le dernier draw */
64  fcommMatchTex(in2 = _tempTexId[1], 0);
66  }
67 
68  glBindTexture(GL_TEXTURE_2D, rout);
69  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
70  glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
71  if(!bl) glEnable(GL_BLEND);
72  if(dt) glDisable(GL_DEPTH_TEST);
73 #ifndef __GLES4D__
74  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
75 #endif
76  glViewport(0, 0, w, h);
77  glGenFramebuffers(1, &fbo);
78  glBindFramebuffer(GL_FRAMEBUFFER, fbo); {
79  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rout, 0);
80  glUseProgram(_opPId);
81  glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, in1);
82  glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, in2);
83  glUniform1i(glGetUniformLocation(_opPId, "tex0"), 0);
84  glUniform1i(glGetUniformLocation(_opPId, "tex1"), 1);
85  glUniform1i(glGetUniformLocation(_opPId, "inv"), flipV);
86  glUniform1i(glGetUniformLocation(_opPId, "op"), _op - _op0);
88  glBindTexture(GL_TEXTURE_2D, 0);
89  glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, 0);
90  glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, 0);
91  }
92  if(!out) { /* Copier à l'écran en cas de out nul */
93  glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
94  glBlitFramebuffer(0, 0, w, h, vp[0], vp[1], vp[0] + vp[2], vp[1] + vp[3], GL_COLOR_BUFFER_BIT, GL_NEAREST);
95  } else if(rout == _tempTexId[2])
96  gl4dfConvTex2Tex(_tempTexId[2], out, GL_FALSE);
97  glViewport(vp[0], vp[1], vp[2], vp[3]);
98  glUseProgram(cpId);
99  glBindFramebuffer(GL_FRAMEBUFFER, cfbo);
100  glBindTexture(GL_TEXTURE_2D, ctex);
101 #ifndef __GLES4D__
102  glPolygonMode(GL_FRONT_AND_BACK, polygonMode[0]);
103 #endif
104  if(!bl) glDisable(GL_BLEND);
105  if(dt) glEnable(GL_DEPTH_TEST);
106  glDeleteFramebuffers(1, &fbo);
107 }

Références _op, _op0, _opPId, _tempTexId, fcommGetPlane(), fcommMatchTex(), gl4dfConvFrame2Tex(), gl4dfConvTex2Tex(), et gl4dgDraw().

Référencé par opfinit().

◆ opfinit()

static void opfinit ( GLuint  in1,
GLuint  in2,
GLuint  out,
GLboolean  flipV 
)
static
35  {
36  init();
37  opfptr = opffunc;
38  opfptr(in1, in2, out, flipV);
39 }

Références init(), et opffunc().

Référencé par quit().

◆ quit()

static void quit ( void  )
static
165  {
166  if(_tempTexId[0]) {
167  glDeleteTextures((sizeof _tempTexId / sizeof *_tempTexId), _tempTexId);
168  _tempTexId[0] = 0;
169  }
170  _opPId = 0;
171  opfptr = opfinit;
172 }

Références _opPId, _tempTexId, et opfinit().

Référencé par init().

Documentation des variables

◆ _op

GLuint _op = GL4DF_OP_ADD
static

Référencé par gl4dfOpSetOp(), et opffunc().

◆ _op0

const GLuint _op0 = GL4DF_OP_ADD
static

Référencé par opffunc().

◆ _opPId

GLuint _opPId = 0
static

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

◆ _tempTexId

GLuint _tempTexId[3] = { 0 }
static

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

_opPId
static GLuint _opPId
Definition: gl4dfOp.c:19
init
static void init(void)
Definition: gl4dfOp.c:109
gl4dfBasicVS
static const char * gl4dfBasicVS
Definition: gl4dfCommon.h:22
quit
static void quit(void)
Definition: gl4dfOp.c:165
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
_op0
static const GLuint _op0
Definition: gl4dfOp.c:18
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
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
_tempTexId
static GLuint _tempTexId[3]
Definition: gl4dfOp.c:19
gl4dfConvFrame2Tex
GL4DAPI void GL4DAPIENTRY gl4dfConvFrame2Tex(GLuint *out)
Envoie le framebuffer actif (ou l'écran) vers une texture.
Definition: gl4dfConversion.c:21
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
opffunc
static void opffunc(GLuint in1, GLuint in2, GLuint out, GLboolean flipV)
Definition: gl4dfOp.c:42
fcommGetPlane
GLuint fcommGetPlane(void)
Definition: gl4dfCommon.c:65
_op
static GLuint _op
Definition: gl4dfOp.c:19
opfinit
static void opfinit(GLuint in1, GLuint in2, GLuint out, GLboolean flipV)
Definition: gl4dfOp.c:35