home *** CD-ROM | disk | FTP | other *** search
- ////////////////////////////////////////////////////
- // Sharpen complex v2 (nΘcessite ps >=2a)
- ////////////////////////////////////////////////////
- sampler s0 : register(s0);
- float4 p0 : register(c0);
- float4 p1 : register(c1);
-
- // rΘsolution de l'image
- #define width (p0[0])
- #define height (p0[1])
- // "largeur" d'un pixel
- #define px (p1[0])
- #define py (p1[1])
-
-
- ////////////////////////////////////////////////////
- // ParamΦtres
- ////////////////////////////////////////////////////
- // pour le calcul du flou
- #define moyenne 0.6
- #define dx (moyenne*px)
- #define dy (moyenne*py)
-
- #define CoefFlou 2
- #define CoefOri (1+ CoefFlou)
-
- // pour le sharpen
- #define SharpenEdge 0.2
- #define Sharpen_val0 2
- #define Sharpen_val1 ((Sharpen_val0-1) / 8.0)
-
-
- ////////////////////////////////////////////////////
- float4 main( float2 tex : TEXCOORD0 ) : COLOR
- {
- // recup du pixel original
- float4 ori = tex2D(s0, tex); ;
-
- ////////////////////////////////////////////////////
- // calcul image floue (filtre gaussien)
- ////////////////////////////////////////////////////
- float4 c1 = tex2D(s0, tex + float2(-dx,-dy));
- float4 c2 = tex2D(s0, tex + float2(0,-dy));
- float4 c3 = tex2D(s0, tex + float2(dx,-dy));
- float4 c4 = tex2D(s0, tex + float2(-dx,0));
- float4 c5 = tex2D(s0, tex + float2(dx,0));
- float4 c6 = tex2D(s0, tex + float2(-dx,dy));
- float4 c7 = tex2D(s0, tex + float2(0,dy));
- float4 c8 = tex2D(s0, tex + float2(dx,dy));
-
- // filtre gaussien
- // [ 1, 2 , 1 ]
- // [ 2, 4 , 2 ]
- // [ 1, 2 , 1 ]
- // pour normaliser les valeurs, il faut diviser par la somme des coef
- // 1 / (1+2+1+2+4+2+1+2+1) = 1 / 16 = .0625
- float4 flou = (c1+c3+c6+c8 + 2*(c2+c4+c5+c7)+ 4*ori)*0.0625;
-
- // soustraction de l'image flou α l'image originale
- float4 cori = CoefOri*ori - CoefFlou*flou;
-
- ////////////////////////////////////////////////////
- // dΘtection des contours
- ////////////////////////////////////////////////////
- // rΘcuppΘration des 9 voisins
- // [ c1, c2 , c3 ]
- // [ c4,ori , c5 ]
- // [ c6, c7 , c8 ]
- c1 = tex2D(s0, tex + float2(-px,-py));
- c2 = tex2D(s0, tex + float2(0,-py));
- c3 = tex2D(s0, tex + float2(px,-py));
- c4 = tex2D(s0, tex + float2(-px,0));
- c5 = tex2D(s0, tex + float2(px,0));
- c6 = tex2D(s0, tex + float2(-px,py));
- c7 = tex2D(s0, tex + float2(0,py));
- c8 = tex2D(s0, tex + float2(px,py));
-
- // par filtre de sobel
- // Gradient horizontal
- // [ -1, 0 ,1 ]
- // [ -2, 0, 2 ]
- // [ -1, 0 ,1 ]
- float delta1 = (c3 + 2*c5 + c8)-(c1 + 2*c4 + c6);
-
- // Gradient vertical
- // [ -1,- 2,-1 ]
- // [ 0, 0, 0 ]
- // [ 1, 2, 1 ]
- float delta2 = (c6 + 2*c7 + c8)-(c1 + 2*c2 + c3);
-
- // calcul
- if( sqrt( mul(delta1,delta1) + mul(delta2,delta2) ) >SharpenEdge )
- {
- ////////////////////////////////////////////////////
- // si contour, sharpen
- // return float4(1,0,0,0);
- return ori*Sharpen_val0 - (c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 ) * Sharpen_val1 ;
- }
- else
- {
- ////////////////////////////////////////////////////
- // sinon, image corrigΘe
- return cori;
- }
- }
-
-