Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2012-10-29 14:48:18 [GLSL / Maths] Translation et scaling dans un GLSL

Makio135
membre
Lieu: Lyon
Date d'inscription: 2010-11-11
Messages: 89
Site web

[GLSL / Maths] Translation et scaling dans un GLSL



Salut tous,

J'ai un petit problème de maths pour une translation scalée dans un glsl:
J'utilise GLGraphics& GSVideo.
J'ai un GSMovie qui joue dans une GLTexture tex, j'applique un GLTextureFilter ClipFilter qui translate mon clip en suivant les coordonnées de la souris, et applique deux variables Opacity et Scale.
Le problème est que je veux appliquer le scale en restant centré sur la souris.

J'utilise cette formule dans le GLSL:
vec2 tex_coord = (gl_TexCoord[0].st - posXY)/Scale;
Sans le scale, la translation est nickelle, mais avec, c'est plus vraiment ça...
Les valeurs de posXY vont de -.5 à .5 pour rester au centre.

Donc voici le programme:

GLSLClip.pde:

import processing.opengl.*;
import codeanticode.glgraphics.*;
import codeanticode.gsvideo.*;

GSMovie movie;
GLTexture tex, texFiltered;

GLTextureFilter ClipFilter;
float Opacity=.5, Scale=1.0;

void setup() {
 size(640, 480, GLConstants.GLGRAPHICS);
  
 tex = new GLTexture(this);
 texFiltered = new GLTexture(this);
  
 movie = new GSMovie(this, "station.mov");
 movie.setPixelDest(tex);
 movie.loop();
  
 ClipFilter = new GLTextureFilter(this, "ClipFilter.xml");
}

void movieEvent(GSMovie movie) {
 movie.read();
}

void draw() {
 if (movie.ready() && movie.width>1) {
 if (tex.putPixelsIntoTexture()) {
 background(255, 0, 0);

 float x = map(mouseX, 0, width, -.5, .5);
 float y = map(mouseY, 0, height, -.5, .5);
 ClipFilter.setParameterValue("posXY", new float[]{x, y});
 ClipFilter.setParameterValue("Scale", Scale); 
 ClipFilter.setParameterValue("Opacity", Opacity);  
 tex.filter(ClipFilter, texFiltered);
 image(texFiltered, 0, 0, width, height);
 }
 }
}

void keyPressed() {
 if(key == CODED){
 if (keyCode == UP && Opacity<1){
 Opacity += .1;
 println("Opacity: "+Opacity);
 }
 else if (keyCode == DOWN && Opacity>0){
 Opacity -= .1;
 println("Opacity: "+Opacity);
 }
 else if (keyCode == LEFT && Scale>.1){
 Scale -= .1;
 println("Scale: "+Scale);
 }
 else if (keyCode == RIGHT && Scale<3){
 Scale += .1;
 println("Scale: "+Scale);
 }
 }
}

ClipFilter.xml:

<filter name="Clip Filter">
 <description>Clip Filter with posXY,Scale,Opacity</description>
 <fragment>ClipFilter.glsl</fragment>
 <textures input="1" output="1"></textures>
 <parameter type="vec2" name="posXY" label="Clip position">0 0</parameter>
 <parameter type="float" name="Scale" label="Scale">1</parameter>
 <parameter type="float" name="Opacity" label="Opacity">1</parameter>
</filter>

ClipFilter.glsl:

Ça doit pas être très complexe mais j'arrive pas à trouver...

Thanks.

Hors ligne

 

#2 2012-10-30 17:20:09 Re : [GLSL / Maths] Translation et scaling dans un GLSL

Makio135
membre
Lieu: Lyon
Date d'inscription: 2010-11-11
Messages: 89
Site web

Re: [GLSL / Maths] Translation et scaling dans un GLSL



Finalement trouvé la solution en faisant un petit sketch intermédiaire qui fait ce qui se passe dans le shader...

uniform sampler2D src_tex_unit0;
uniform vec2 src_tex_offset0;

uniform vec2 posXY;
uniform float Scale;
uniform float Opacity;

void main(void)
{
	vec2 centre = vec2((1-(1/Scale))/2, (1-(1/Scale))/2);
	vec2 tex_coord = gl_TexCoord[0].st/Scale + centre - posXY/Scale;
	vec4 color0 = texture2D(src_tex_unit0, tex_coord);

	if(tex_coord[0] <= 0) gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
	else if(tex_coord[0] >= 1) gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
	else if(tex_coord[1] <= 0) gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
	else if(tex_coord[1] >= 1) gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
	else gl_FragColor = vec4(color0.rgb, Opacity);
}

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2025