Ce matin en prenant mon café et en regardant les réponses sur le topic Datamoshing, je me suis dit que ça pourrait être pas mal de se faire une collection de shaders tout prêts à utiliser....
Je reconnais que c'est fastidieux de les adapter un à un, ça prend du temps, c'est chiant, c'est pas beau, y'a beaucoup de fils, mais quand même c'est un sacré outil pour les utilisateurs de GEM...
Donc je remet ici le shader du datamoshing histoire de centraliser tout ça, plus quelques indications pour adapter les shaders glanés ici et là.... ( je précise que ces indications sont un mélange de recherches et d'empirisme donc n'hésitez pas à me reprendre si je me plante ou à me poser des questions si je ne suis pas clair...)
Deux axes de travail ( si vous le voulez bien ) :
L'adaptations de shaders glanés ici et là;
Une petite ergonomie pour les rendre un peu plus attrayant ( genre le [pix-shader] de guimo mais en mieux avec encore moins de fils au final!);
donc:
Quelques regles de base pour utiliser les shaders sous pure-data : ( et non pas pour les créer )
Deux modes pour l'objet [pix-texture] :
0 = TEXTURE_2D : à utiliser lorsque l'on voit par exemple texture2D dans les fichiers .frag
1 = TEXTURE_RECTANGLE : à utiliser lorsque l'on voit par exemple texture2Drect dans les fichiers .frag, dans ce cas, il faut rajouter "#extension GL_ARB_texture_rectangle : enable" pour le bon fonctionnement du shader.
L'argument 'texunit X' force l'openGL à mettre une certaine addresse à la texture.
les arguments de variables à balancer sur le [glsl_program] sont signifiées dans le fichier .frag par le préfixe "uniform".
On ne peut les envoyer que lorsque la fenêtre GEM est activée.
Dans le .frag :
-sampler2D(rect) nom_de_la_variable ->addresse texture d'entrée
-vect, float, etc... ça marche pareil...
l'expression varying est une récupération de variable qui doit être déclarée au préalable à partir du fichier .vert
L'objet [pix_texture] dépendant de la chaine contenant le shader n'est pas "initialisé" à proprement parlé (sauf si on intercale un objet [pix_image,film,video etc...];
on peut utiliser [pix-set] pour lui donner les coordonnées de texture ou bien lui addresser d'autres coordonées de textures provenant d'autres objets (lien entre deux [pix-texture] comme j'ai fait dans optical : le rendu sera différent si on met les coordonées de [pix-vidéo] ou [pix-image])
ce que doit contenir le shader :
varying vec2 blablabla;
uniform vec4 blublublu;
void main()
{
blobloblo;
}
exemple de fichier max (ici ab.hsflow.jsx)
<jittershader name="hsflow">
<description>
Basic Horn-Schunke Optical Flow Implementation. Not textbook, but good enough for experimental video...
</description>
<param name="lambda" type="float" default="0.">
<description>noise limiting (lambda) </description>
</param>
<param name="scale" type="vec2" default="1. 1.">
<description>scales the calculation result</description>
</param>
<param name="offset" type="vec2" default="1. 1.">
<description>distance between texel samples for gradient calculation</description>
</param>
<param name="tex0" type="int" default="0" />
<param name="tex1" type="int" default="1" />
<language name="glsl" version="1.0">
<bind param="lambda" program="fp" />
<bind param="scale" program="fp" />
<bind param="offset" program="fp" />
<bind param="tex0" program="fp" />
<bind param="tex1" program="fp" />
<program name="vp" type="vertex" source="sh.passthru.xform.vp.glsl" /> =>source du fichier .vert
<program name="fp" type="fragment">
<![CDATA[
//Andrew Benson - andrewb@cycling74.com
//2009
// texcoords
varying vec2 texcoord0;
varying vec2 texcoord1;
// samplers
uniform sampler2DRect tex0;
uniform sampler2DRect tex1;
//variables
uniform vec2 scale;
uniform vec2 offset;
uniform float lambda;
const vec4 lumcoeff = vec4(0.299,0.587,0.114,0.);
// entry point
void main()
{
vec4 a = texture2DRect(tex0, texcoord0);
vec4 b = texture2DRect(tex1, texcoord1);
vec2 x1 = vec2(offset.x,0.);
vec2 y1 = vec2(0.,offset.y);
//get the difference
vec4 curdif = b-a;
//calculate the gradient
vec4 gradx = texture2DRect(tex1, texcoord1+x1)-texture2DRect(tex1, texcoord1-x1);
gradx += texture2DRect(tex0, texcoord0+x1)-texture2DRect(tex0, texcoord0-x1);
vec4 grady = texture2DRect(tex1, texcoord1+y1)-texture2DRect(tex1, texcoord1-y1);
grady += texture2DRect(tex0, texcoord0+y1)-texture2DRect(tex0, texcoord0-y1);
vec4 gradmag = sqrt((gradx*gradx)+(grady*grady)+vec4(lambda));
vec4 vx = curdif*(gradx/gradmag);
float vxd = vx.r;//assumes greyscale
//format output for flowrepos, out(-x,+x,-y,+y)
vec2 xout = vec2(max(vxd,0.),abs(min(vxd,0.)))*scale.x;
vec4 vy = curdif*(grady/gradmag);
float vyd = vy.r;//assumes greyscale
//format output for flowrepos, out(-x,+x,-y,+y)
vec2 yout = vec2(max(vyd,0.),abs(min(vyd,0.)))*scale.y;
gl_FragColor = vec4(xout.xy,yout.xy);
}
=>fichier .frag
]]>
</program>
</language>
</jittershader>
Voilou, y'en a qui sont chauds??? ( olivier?! )
Dernière modification par nononononono (2011-11-21 10:49:56)
Hors ligne
S'il y avait des smileys qui sautent sur place sur Codelab, j'en aurais posté une ligne...
Avec Benjamin, nous avions dans l'idée de nous caler une session intensive sur la question avant la fin de l'année...
La victoire n'est qu'une formalité... (mais bon, pour l'instant, je pars de loin...)
Hors ligne
De mémoire, il n'y a pas déjà un site qui récupère plein de codes de shaders ? Il me semble qu''il en a déjà été question. Pas un truc spécifique à Pd.
D'autre part, il a été question de porter une grosse quantité de d'objets de GEM (les pix_*) en shaders pour alléger les rendus au niveau CPU. Il me semble avoir lu ça soit ici, soit sur #dataflow, soit sur la pd-list soit sur le forum "hurleur"... yénéséplou...
Il y a Guido qui peut être chaud aussi pour ce genre de truc si on ne se limite pas à a communauté codelab. Et on peut aussi demander à Cyrille Henry je pense.
Hors ligne
Pour remplacer les [pix-...], il y a pas mal de choses dans les shaders de base de max ( genre convolution qui dépense un max de ressources ), du coup, je me disais si on pouvais faire une abstraction par shader, histoire de pouvoir les utiliser comme un pix ( du genre [glsl-convolve] avec des inlet et des outlets un peu partout!.... )
Sinon si tu veux brancher guido ou cyrille henry ben c'est encore mieux...
Dernière modification par nononononono (2011-11-18 16:38:22)
Hors ligne
Sur les shaders GLSL en général, et pas spécifiquement pure-data, jetez un oeil là-dessus
http://www.iquilezles.org/apps/shadertoy (avec un nav. qui supporte WebGL)
http://mrdoob.com/projects/glsl_sandbox
et aussi
http://en.wikibooks.org/wiki/GLSL_Programming
et d'autres bookmarks en cherchant glsl ou opengl dans http://codelab.fr/liens
Hors ligne
Y'a aussi le shader de profondeur de champ (<3) qui est juste ENORME :
http://puredata.hurleur.com/sujet-6263-gem-depth-field
Hors ligne
hello
je suis partant.
toujours unpeu débordman, mais ce serait bien en effet de faire un librairie dédié à cela.
Hors ligne
Cool,
Après, un problème se pose, c'est celui de droit d'auteur je suis pas sur que pomper les shaders de Max par exemple soit d'une légalité à toute épreuve...
Qu'en pensez vous?
Hors ligne
ohhhhh lalalalalalalalala .............. c'est vrai que sur max ils sont à donf © .... beurk ... pas de réponse sur ce sujet ?
Hors ligne
Pas de réponse pour ma part, à part si une âme charitable se dévouait pour le leur demander directement?
( Je le ferai bien, mais moi et mon anglais et ma diplomatie légendaire ferait tout capoter dès ma première demande )
Ou alors juste en changeant les noms des variables et en changeant le mode (y sont tous en TEXTURE_RECTANGLE; y'a cas les paser en TEXTURE_2D....)
Sinon dans max, j'ai fini les convolutions, fait la moitié des composites, et commencé les colors, j'attend de savoir avant de poster tout ça...
NB; je me suis planté, pas besoin de "#extension GL_ARB_texture_rectangle : enable" tout marche au poil sans rien changer au chimiliblik; je rature de ce pas mon premier post.
Dernière modification par nononononono (2011-11-21 10:51:38)
Hors ligne
nononononono a écrit:
Ou alors juste en changeant les noms des variables et en changeant le mode (y sont tous en TEXTURE_RECTANGLE; y'a cas les paser en TEXTURE_2D....
si la license n'est pas compatible tu n'as évidement pas le droit de faire ca...
sinon j'ai vu que certains shaders de max ont une license (ceux dans le dossier shared notament), mais pour les autres je ne sais pas.
y a aussi pas mal de shaders pour max dispo sur le web (avec et/ou sans license):
http://www.huesforalice.com/project/jitter_shader
http://001.vade.info/?page_id=20
etc...
++
_y
Hors ligne
Je m'en doutais un peu...
ci joint les shaders open source de ton premier lien {yv}!
Hors ligne
par contre sur le deuxième, alors qu'is sont soit disant open source, j'apperçoit :
/*
*
* Andrew Benson - andrewb@cycling74.com
* Copyright 2005 - Cycling '74
*
* GLSL vertex program for doing a standard vertex transform
* with texture coordinates, also passing the texture dimensions to the fragment shader.
*
*/
Hors ligne
Grosse discussion shader ce soir au Tetalab avec rep, nonononono et pob. C'est bon à trois on va pouvoir faire des patching circles à Toulouse !
Hors ligne
éééh ouais ça fait plaisir aussi de voir les gens du forum en vrai
Le lien dont je te parlais nonononooooonono :
http://3dshaders.com/home/index.php?opt … ;Itemid=34
avec en autres, en bas de page, tous les exemples de l'orange book.
Hors ligne