+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité de passage
    Homme Profil pro
    Inscrit en
    novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2012
    Messages : 12
    Points : 2
    Points
    2

    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

  2. #2
    Invité de passage
    Homme Profil pro
    Inscrit en
    novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2012
    Messages : 12
    Points : 2
    Points
    2

    Par défaut

    Erreur trouvée, le code marche, c'était une erreur d'étourderie ailleurs dans le code... :mrgreen

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •