Algorithme surface de Bézier
Bonjour à tous !
Je travaille sur une application qui doit être projetée sur un écran cylindrique. En conséquence, je dois programmer une déformation d'image car pour avoir une image rectangulaire sur l'écran cylindrique, je dois la déformer en amont.
Ma méthode est de faire un render to texture de ma scène sur un quad et de jouer avec les UV de la texture dans un fragment shader.
Je fais donc un shader qui va déformer une texture à partir de points de contrôle. Pour le moment, j'ai simplement 9 points de contrôle.
Pour avoir une déformation continue, je veux interpoler mes UV avec une surface de Bézier.
J'ai fait mon shader mais je n'obtiens pas la bonne déformation. Je sais que je me plante quelque part dans le calcul mathématique mais seul, j'ai du mal à trouver où...
Voici le shader :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| uniform sampler2D texture;
uniform float ctrlPts[18]; // P(0,0).x / P(0,0).y / P(1,0).x / P(1,0).y / ... / P(2,2).x / P(2,2).y
//Calcule n!
int factorial(int n){
if(n==0)
return 1;
int result=n;
int etape=n;
while(etape!=1){
etape--;
result*=etape;
}
return result;
}
//Calcule le coefficient binomial (i,n)
int binomialCoefficient(int i, int n){
return factorial(n)/(factorial(i)*factorial(n-i));
}
//Calcule le polynôme de Bernstein Bi,n(u)
float bernstein(int i, int n, float u){
return binomialCoefficient(i,n)*pow(u,(float)i)*pow((1-u),(float)(n-i));
}
//******************************************************************************
//MAIN
//******************************************************************************
void main(){
vec2 TexCoord = vec2(gl_TexCoord[0]);
//SURFACE BEZIER
vec2 result=vec2(0,0);
vec2 somme;
for(int i=0 ; i<=2 ; i++)
{
somme=vec2(0,0);
for(int j=0 ; j<=2 ; j++)
{
vec2 Pij= vec2(ctrlPts[j*6+2*i],ctrlPts[j*6+2*i+1]);
somme+=Pij*bernstein(i, 2, TexCoord.x)*bernstein(j, 2, TexCoord.y);
}
result+=somme;
}
TexCoord=result;
// Sampling The Texture And Passing It To The Frame Buffer
gl_FragColor = texture2D(texture, TexCoord);
} |
Je continue de chercher mon erreur mais votre aide est la bienvenue.
Merci d'avance