[PD] flip image in glsl

Jack jack at rybn.org
Tue Apr 9 11:53:55 CEST 2013


Le 08/04/2013 17:47, Patrice Colet a écrit :
> I've implemented all the stuff for flipping horizontaly and verticaly, 
> there is an attached example, but it's not very elegant, there is warning messages even if it works good, maybe there is a better way to do it?
>
>
> Colet Patrice
>
> ----- Mail original -----
>> De: "Patrice Colet" <colet.patrice at free.fr>
>> À: "pd-list" <pd-list at iem.at>
>> Cc: "Cyrille Henry" <ch at chnry.net>
>> Envoyé: Lundi 8 Avril 2013 16:37:29
>> Objet: Re: [PD] flip image in glsl
>>
>> Got it, thanks a lot!
>>
>> Colet Patrice
>>
>> ----- Mail original -----
>>> De: "Cyrille Henry" <ch at chnry.net>
>>> À: "Patrice Colet" <colet.patrice at free.fr>
>>> Cc: "pd-list" <pd-list at iem.at>
>>> Envoyé: Lundi 8 Avril 2013 10:05:22
>>> Objet: Re: [PD] flip image in glsl
>>>
>>> hello,
>>>
>>> when using rectangular texturing, coordinate goes from 0 to image
>>> pixel size.
>>> when using "rectangle 0" mode, pixel coordinate goes from 0 to 1.
>>> (sometimes 1 is for the power of 2 bigger than the image pixel
>>> size)
>>>
>>> so, in rectangular mode, use pixetl_size - image coordinate to flip
>>> the image.
>>> and 1 - image coordinate in non rectangle mode.
>>>
>>> Image can be fliped because the "fliped" flag is not used on the
>>> shader.
>>>
>>> cheers
>>> c
>>>
>>>
>>>
>>> Le 08/04/2013 09:24, Patrice Colet a écrit :
>>>> Hello,
>>>>
>>>>   how is it possible to flip upside down an image in glsl example
>>>>   05.multitexture
>>>>
>>>> I tried to implement this in fragment program:
>>>>
>>>> http://stackoverflow.com/questions/9857089/flip-upside-down-vertex-shader-gles
>>>>
>>>> but it doesn't work. The only thing I can do is changing texture
>>>> scale and position, but I couldn't do it with negative values
>>>> like it would be done in pix_coordinates.
>>>>
>>>> In fact when I use pix_multiimage before pix_texture, the image
>>>> gets flipped, I don't know why...
>>>>
>>>> Colet Patrice
>>>>
>>>>
>>>> _______________________________________________
>>>> Pd-list at iem.at mailing list
>>>> UNSUBSCRIBE and account-management ->
>>>> http://lists.puredata.info/listinfo/pd-list
>>>>
>> _______________________________________________
>> Pd-list at iem.at mailing list
>> UNSUBSCRIBE and account-management ->
>> http://lists.puredata.info/listinfo/pd-list
>>
>>
>>
>> _______________________________________________
>> Pd-list at iem.at mailing list
>> UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list
Hello Patrice,

You can do operations directly on vec2 instead of two floats in your
fragment shader.
You can also avoid condition (could be slow).
See patch and glsl vertex and fragment attached for flip.
++

Jack


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puredata.info/pipermail/pd-list/attachments/20130409/d1436ffb/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 06.rectangle_multitexture_flip.pd
Type: application/puredata
Size: 6305 bytes
Desc: not available
URL: <http://lists.puredata.info/pipermail/pd-list/attachments/20130409/d1436ffb/attachment-0001.bin>
-------------- next part --------------
//jack/RYBN 2010
#extension GL_EXT_gpu_shader4 : enable
#extension GL_ARB_texture_rectangle : enable

uniform sampler2DRect Ttex1;
uniform sampler2DRect Ttex2;
uniform sampler2DRect tex0;
uniform float style;
uniform float mix_factor;
uniform vec2 flip1, flip2;
uniform vec2 dimen;

varying vec2 texcoord0;
ivec2 size1 = textureSize2DRect(Ttex1, 0);
ivec2 size2 = textureSize2DRect(Ttex2, 0);
ivec2 size0 = textureSize2DRect(tex0, 0);

void main (void)
{
	vec2 sizeF1 = vec2(size1)/vec2(size0);
	vec2 sizeF2 = vec2(size2)/vec2(size0);
	vec4 color1 = texture2DRect(Ttex1, abs(flip1*dimen-texcoord0)*sizeF1);
	vec4 color2 = texture2DRect(Ttex2, abs(flip2*dimen-texcoord0)*sizeF2);

	if (style == 0.) {
		gl_FragColor = (color1 + color2);
	} else if (style == 1.) {
		gl_FragColor = (color1 - color2);
	} else if (style == 2.) {
		gl_FragColor = abs(color1 - color2);
	} else if (style == 3.) {
		gl_FragColor = (color1 * color2);
	} else if (style == 4.) {
		gl_FragColor = mix(color1,color2,mix_factor);
	}

}

-------------- next part --------------
//jack/RYBN 2010
varying vec2 texcoord0;

void main()
{
	texcoord0 = (gl_TextureMatrix[0]*gl_MultiTexCoord0).st;
	gl_Position = ftransform();

}


More information about the Pd-list mailing list