Welcome to mirror list, hosted at ThFree Co, Russian Federation.

EdgeSharpen.psh « shaders « res « mplayerc « apps « src - github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 78956d698135103d1d8f34b73f6b4109e21a9200 (plain)
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
56
sampler s0 : register(s0); 
float4 p0 : register(c0); 

#define width (p0[0]) 
#define height (p0[1]) 

#define NbPixel      1 

#define Edge_threshold       0.2 

#define Sharpen_val0       2.0 
#define Sharpen_val1       0.125 

float4 main(float2 tex : TEXCOORD0) : COLOR 
{ 
// taille de NbPixel pixels 
float dx = NbPixel/width; 
float dy = NbPixel/height; 
float4 Res = 0; 

// Détection de contour par Prewitt 
   // récuppération des 9 points 
   //   [ 1, 2, 3 ] 
   //   [ 4, 0, 5 ] 
   //   [ 6, 7, 8 ] 
   float4 c0 = tex2D(s0, tex); 
   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)); 

   // Calcul des 3 vecteurs dérivé (hor,vert, diag1, diag2) 
   float4 delta1 = (c6+c4+c1-c3-c5-c8); 
   float4 delta2 = (c4+c1+c2-c5-c8-c7); 
   float4 delta3 = (c1+c2+c3-c8-c7-c6); 
   float4 delta4 = (c2+c3+c5-c7-c6-c4); 

   // calcul du Prewitt 
   float value = length(abs(delta1) + abs(delta2) + abs(delta3) + abs(delta4))/6; 

// Si c'est un contour (vector lenght > Edge_threshold) => filtre de sharpen 
   if(value > Edge_threshold ) 
   { 
      Res = c0 * Sharpen_val0 - (c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 ) * Sharpen_val1 ; 
      // Pour voir les contour en rouge ... 
      //Res = float4( 1.0, 0.0, 0.0, 0.0 ); 

      return Res; 
   } 
   else 
      return c0; 
}