Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
ressource:code:processing:shaders [2022/09/07 10:24] gweltaz |
ressource:code:processing:shaders [2022/09/07 11:58] gweltaz [Communication entre l'application et les shaders] |
||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
===== Le hello World des shaders ===== | ===== Le hello World des shaders ===== | ||
+ | |||
+ | Les fichiers ''vert.glsl'' et ''frag.glsl'' sont à placer dans le dossier ''data'' du sketch. | ||
<accordion><panel title="shader_01"> | <accordion><panel title="shader_01"> | ||
Ligne 54: | Ligne 56: | ||
===== Communication entre l'application et les shaders ===== | ===== Communication entre l'application et les shaders ===== | ||
+ | {{ :ressource:code:processing:shader_comm.png?direct |}} | ||
+ | |||
L'application (programme Processing) peut envoyer des données vers les shaders par des variable déclarées avec le mot-clé ''uniform''. | L'application (programme Processing) peut envoyer des données vers les shaders par des variable déclarées avec le mot-clé ''uniform''. | ||
Ligne 76: | Ligne 80: | ||
===== Textures ===== | ===== Textures ===== | ||
+ | Pour sampler un texel en GLSL (extraire la couleur d'une texture à un point donné), on utilise la fonction: | ||
+ | ''texture2D(sampler2D image, vec2 uv)'' \\ | ||
+ | Les coordonnes UV doivent être comprises entre 0.0 et 1.0 \\ | ||
+ | Elles pour origine le coin bas-gauche (0, 0) contrairement aux coordonnées d'écran, qui ont pour origine le coin haut-gauche. | ||
+ | |||
+ | ===== Utilisation d'un buffer hors-écran ===== | ||
+ | Pratique pour créer des effets avec retour d'information (feedback), comme par exemple un effet de réaction-diffusion. | ||
+ | |||
+ | <code java> | ||
+ | PGraphics buffer = createGraphics(x, y, P2D); | ||
+ | |||
+ | buffer.beginDraw(); | ||
+ | buffer.shader(myShader); | ||
+ | buffer.rect(0, 0, buffer.width, buffer.height); | ||
+ | buffer.endDraw(); | ||
+ | |||
+ | image(buffer, 0, 0); | ||
+ | </code> | ||
+ | |||
===== Fonctions utiles ===== | ===== Fonctions utiles ===== | ||
Ligne 157: | Ligne 180: | ||
(c - a)* u.y * (1.0 - u.x) + | (c - a)* u.y * (1.0 - u.x) + | ||
(d - b) * u.x * u.y; | (d - b) * u.x * u.y; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | == Fractional Brownian Motion == | ||
+ | <code glsl> | ||
+ | float hash(vec2 coord) | ||
+ | { | ||
+ | return fract(sin(dot(coord.xy, vec2(12.9898, 78.233))) * 43758.5453123); | ||
+ | } | ||
+ | |||
+ | float noise(vec2 U) | ||
+ | { | ||
+ | vec2 id = floor(U); | ||
+ | U = fract(U); | ||
+ | U *= U * ( 3. - 2. * U ); | ||
+ | |||
+ | vec2 A = vec2( hash(id), hash(id + vec2(0,1)) ), | ||
+ | B = vec2( hash(id + vec2(1,0)), hash(id + vec2(1,1)) ), | ||
+ | C = mix( A, B, U.x); | ||
+ | |||
+ | return mix( C.x, C.y, U.y ); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | fBM stands for Fractional Brownian Motion | ||
+ | https://iquilezles.org/articles/fbm/ | ||
+ | Set octave to 8 for a detailed noise | ||
+ | A value of 1.0 for H is good | ||
+ | */ | ||
+ | float fbm(vec2 x, float H, int octave) | ||
+ | { | ||
+ | float G = exp2(-H); | ||
+ | float f = 1.0; | ||
+ | float a = 1.0; | ||
+ | float t = 0.0; | ||
+ | for( int i=0; i<octave; i++ ) | ||
+ | { | ||
+ | t += a*noise(f*x); | ||
+ | f *= 2.0; | ||
+ | a *= G; | ||
+ | } | ||
+ | return t; | ||
} | } | ||
</code> | </code> |