Précédent   Forum du club des développeurs et IT Pro > Autres langages > Algorithmes > Mathématiques
Mathématiques Forum d'entraide sur les mathématiques et l'algorithmique numérique. Avant de poster : Cours d'algorithmique numérique
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/11/2012, 16h07   #1
MrVylsain
Invité de passage
 
Homme
Inscription : novembre 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2012
Messages : 12
Points : 0
Points : 0
Par défaut 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
MrVylsain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2012, 09h01   #2
MrVylsain
Invité de passage
 
Homme
Inscription : novembre 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2012
Messages : 12
Points : 0
Points : 0
Erreur trouvée, le code marche, c'était une erreur d'étourderie ailleurs dans le code... :mrgreen
MrVylsain est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h15.


 
 
 
 
Partenaires

Hébergement Web