[PD] Image from shader back to Gem
oliver
oliver at klingt.org
Mon Feb 15 10:46:14 CET 2021
cyrille henry wrote:
> What I understand from the original question was how to feed an image
> generated with a shader to pix_movement.
> So one need an image, not a texture.
> I'm afraid pix_snap is the only solution.
on a more general note:
it would be great to have something like a public [GEM-shader] archive,
probably something like pdpatchrepo.info
should we open a new category there ?
or maybe that already exists and i missed it ?
anybody else on this list that has some GEM shaders to share ?
i have the feeling that a lot of people using GEM "roll their own"
shaders (i, for one, did) and it would be a great thing to join forces,
so one doesn't have to reinvent the wheel when looking for a simple
"brightness/contrast" shader ...
my own technical knowledge about shader scripting is close to
non-existant, but i succeeded in adapting stuff found on the net, so
that it loads as a shader in GEM. basic stuff only, mixers etc ...
since csaba's original post talks about cropping/rotating a texture
created from a MATLAB shader (would be also great to share !), one
possibility could be to feed this texture into another shader.
i tried my clumsy hands on a quick and dirty adaption of MAX's [rota]
shader, and even though it loads succesfully, it's obviously wrong as
the resulting texture seems to be 1x1 dimension. i'm sure the error is
somewhere in the .vert part.
as i said, i got no deep insight into shader scripting, but maybe this
can help somebody who has
best
oliver
>
> Cheers
> c
>
> Le 15/02/2021 à 08:39, IOhannes m zmoelnig a écrit :
>> On 2/14/21 9:52 PM, Miller Puckette via Pd-list wrote:
>>> I think the question is - within a shader, can you 'snap' an image to
>>> a texture so that it doesn't have to go back and forth between the
>>> GPU and CPU? I'm curious too... I guess there must be a way to do
>>> this...
>>
>>
>> [pix_snap2tex]
>> or, preferably [gemframebuffer].
>>
>> gfamsdr
>> IOhannes
>>
>>
>> _______________________________________________
>> Pd-list at lists.iem.at mailing list
>> UNSUBSCRIBE and account-management ->
>> https://lists.puredata.info/listinfo/pd-list
>
>
>
> _______________________________________________
> Pd-list at lists.iem.at mailing list
> UNSUBSCRIBE and account-management ->
> https://lists.puredata.info/listinfo/pd-list
>
--
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
/////////////// http://pendler.klingt.org //////////////
\\\\\\\\\\\\\\\ http://oliver.klingt.org \\\\\\\\\\\\\\
////////////////////////////////////////////////////////
-------------- next part --------------
/*
*
* Andrew Benson - andrewb at 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.
*
*/
varying vec2 texcoord0;
varying vec2 texcoord1;
varying vec2 texdim0;
varying vec2 texdim1;
void main()
{
// perform standard transform on vertex
gl_Position = ftransform();
// transform texcoords
texcoord0 = vec2(gl_TextureMatrix[0] * gl_MultiTexCoord0);
texcoord1 = vec2(gl_TextureMatrix[1] * gl_MultiTexCoord1);
texdim0 = vec2 (abs(gl_TextureMatrix[0][0][0]),abs(gl_TextureMatrix[0][1][1]));
// texdim0 = vec2 (abs(gl_TextureMatrix[1][0][0]),abs(gl_TextureMatrix[1][1][1])); // this was a royal fuckup :(
texdim1 = vec2 (abs(gl_TextureMatrix[1][0][0]),abs(gl_TextureMatrix[1][1][1]));
}
-------------- next part --------------
//setup for 2 texture
varying vec2 texcoord0;
varying vec2 texcoord1;
varying vec2 texdim0;
uniform vec2 zoom;
uniform vec2 offset;
uniform float theta;
uniform vec2 anchor;
uniform int boundmode;
uniform sampler2DRect tex0;
uniform sampler2DRect tex1;
const float pi=3.1415926;
void main()
{
// where is the point?
vec2 sizea = texdim0;
vec2 point = texcoord0;
//transormation matrices
mat2 sca = mat2 (1./zoom.x,0.,0.,1./zoom.y);//scaling matrix (zoom)
mat2 rot = mat2 (cos(theta),sin(theta),-sin(theta),cos(theta));//rotation matrix
//perform transform
vec2 no = ((((point-anchor*sizea)*rot)*sca)+anchor*sizea)+offset;
//create boundmodes
vec2 no2 = mod(no,sizea);//wrap
vec2 no4 = mix(mod(no,sizea),sizea-mod(no,sizea),floor(mod(no,sizea*2.)/sizea));//folded coords
// sampler coord
vec2 tc = no*float(boundmode==0) + no*float(boundmode==1) + no2*float(boundmode==2) + no*float(boundmode==3) + no4*float(boundmode==4);
//sample textures
vec4 smp0 = texture2DRect(tex0,tc);
vec4 smp1 = texture2DRect(tex1,texcoord0);
vec2 outbound = sign(floor(no/sizea));//check for point>size
float boundchk = float(sign(float(outbound.x!=0.)+float(outbound.y!=0.)));
float checkm0 = float(boundmode==0)*boundchk;
float checkm1 = float(boundmode==1)*float(boundchk==0.);
vec4 ifb0 = mix(smp0,smp1,checkm0);//ignore
vec4 final = ifb0*float(boundmode != 1) + ifb0*float(checkm1==1.);//clear
// output texture
gl_FragColor = final;
}
More information about the Pd-list
mailing list