Je suis en train d'utiliser la bibliothèque GPUImage pour Android pour appliquer certains effets aux bitmaps. Essentiellement, GPUImage accepte les bitmaps et utilise OpenGL ES pour rendre un cube 1 x 1 dans le tampon d'image de la taille du bitmap. L'utilisateur peut écrire un shader de fragment personnalisé pour contrôler la sortie.
Je suis en train d'écrire un shader de fragment, qui fait tourner le bitmap, en lui donnant un angle de rotation. Voici ce que j'ai jusqu'à présent:
varying vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform vec2 inputImageTextureSize;
uniform float angle;
const vec2 HALF = vec2(0.5);
void main()
{
float aSin = sin(angle);
float aCos = cos(angle);
vec2 tc = textureCoordinate;
tc -= HALF.xy;
tc *= mat2(aCos, aSin, -aSin, aCos);
tc += HALF.xy;
vec3 tex = texture2D(inputImageTexture, tc).rgb;
gl_FragColor = vec4(tex, 1.0);
}
Cela fonctionne, mais déforme évidemment le bitmap (car le viewport de GPUImage est configuré pour mapper un cube 1 x 1 à la taille réelle du bitmap). Je ne peux pas trouver comment me débarrasser de la distorsion. Je devrais appliquer une transformation de mise à l'échelle supplémentaire, basée sur l'angle et inputImageTextureSize, mais je n'ai pas réussi à trouver la bonne équation. Aucune des réponses sur StackOverflow ne fonctionne réellement dans mon cas. S'il vous plaît, aidez!
Merci!