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 55
|
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);
} |
Partager