home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Aplikacje_64-bitowe / Daum_PotPlayer / PotPlayer1.5.29332-x64.EXE / PxShader / SharpenComplex2.txt < prev    next >
Text File  |  2010-05-20  |  3KB  |  94 lines

  1. // SharpenComplex2=ps_2_a
  2. // Code from MPC
  3.  
  4. /* Sharpen complex v2 (requires ps >= 2a) */
  5.  
  6. sampler s0 : register(s0);
  7. float4 p0 : register(c0);
  8. float4 p1 : register(c1);
  9.  
  10. #define width (p0[0])
  11. #define height (p0[1])
  12.  
  13. // "largeur" d'un pixel
  14. #define px (p1[0])
  15. #define py (p1[1])
  16.  
  17. /* Parameters */
  18.  
  19. // pour le calcul du flou
  20. #define moyenne 0.6
  21. #define dx (moyenne*px)
  22. #define dy (moyenne*py)
  23.  
  24. #define CoefFlou 2
  25. #define CoefOri (1+ CoefFlou)
  26.  
  27. // pour le sharpen
  28. #define SharpenEdge 0.2
  29. #define Sharpen_val0 2
  30. #define Sharpen_val1 ((Sharpen_val0-1) / 8.0)
  31.  
  32. float4 main( float2 tex : TEXCOORD0 ) : COLOR
  33. {
  34.     // recup du pixel original
  35.     float4 ori = tex2D(s0, tex); ;
  36.  
  37.     // calcul image floue (filtre gaussien)
  38.     float4 c1 = tex2D(s0, tex + float2(-dx,-dy));
  39.     float4 c2 = tex2D(s0, tex + float2(0,-dy));
  40.     float4 c3 = tex2D(s0, tex + float2(dx,-dy));
  41.     float4 c4 = tex2D(s0, tex + float2(-dx,0));
  42.     float4 c5 = tex2D(s0, tex + float2(dx,0));
  43.     float4 c6 = tex2D(s0, tex + float2(-dx,dy));
  44.     float4 c7 = tex2D(s0, tex + float2(0,dy));
  45.     float4 c8 = tex2D(s0, tex + float2(dx,dy));
  46.  
  47.     // filtre gaussien
  48.     //   [ 1, 2 , 1 ]
  49.     //   [ 2, 4 , 2 ]
  50.     //   [ 1, 2 , 1 ]
  51.     // pour normaliser les valeurs, il faut diviser par la somme des coef
  52.     // 1 / (1+2+1+2+4+2+1+2+1) = 1 / 16 = .0625
  53.     float4 flou = (c1+c3+c6+c8 + 2*(c2+c4+c5+c7)+ 4*ori)*0.0625;
  54.  
  55.     // soustraction de l'image flou ?l'image originale
  56.     float4 cori = CoefOri*ori - CoefFlou*flou;
  57.  
  58.     // d?ection des contours
  59.   // r?upp?ation des 9 voisins
  60.   //   [ c1, c2 , c3 ]
  61.   //   [ c4,ori , c5 ]
  62.   //   [ c6, c7 , c8 ]
  63.     c1 = tex2D(s0, tex + float2(-px,-py));
  64.     c2 = tex2D(s0, tex + float2(0,-py));
  65.     c3 = tex2D(s0, tex + float2(px,-py));
  66.     c4 = tex2D(s0, tex + float2(-px,0));
  67.     c5 = tex2D(s0, tex + float2(px,0));
  68.     c6 = tex2D(s0, tex + float2(-px,py));
  69.     c7 = tex2D(s0, tex + float2(0,py));
  70.     c8 = tex2D(s0, tex + float2(px,py));
  71.  
  72.     // par filtre de sobel
  73.     // Gradient horizontal
  74.     //   [ -1, 0 ,1 ]
  75.     //   [ -2, 0, 2 ]
  76.     //   [ -1, 0 ,1 ]
  77.     float delta1 =  (c3 + 2*c5 + c8)-(c1 + 2*c4 + c6);
  78.  
  79.     // Gradient vertical
  80.     //   [ -1,- 2,-1 ]
  81.     //   [  0,  0, 0 ]
  82.     //   [  1,  2, 1 ]
  83.     float delta2 = (c6 + 2*c7 + c8)-(c1 + 2*c2 + c3);
  84.  
  85.     // calcul
  86.     if( sqrt( mul(delta1,delta1) + mul(delta2,delta2) ) >SharpenEdge ) {
  87.         // si contour, sharpen
  88.         //return  float4(1,0,0,0);
  89.         return ori*Sharpen_val0 - (c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 ) * Sharpen_val1 ;
  90.     } else {
  91.         // sinon, image corrig?
  92.         return cori;
  93.     }
  94. }