You are on page 1of 2

// Sharpen Complex v2=ps_2_a

// Code from MPC-HC


// English Translation by SubPixie at http://forum.doom9.org/showthread.php?p=15
37307
/* Sharpen complex v2 (requires ps >= 2a) */
sampler s0 : register(s0);
float4 p0 : register(c0);
float4 p1 : register(c1);
#define width (p0[0])
#define height (p0[1])
// "width" of a pixel
#define px (p1[0])
#define py (p1[1])
/* Parameters */
// Blur
#define
#define
#define

calculation
moyenne 0.6
dx (moyenne*px)
dy (moyenne*py)

#define CoefFlou 2
#define CoefOri (1+ CoefFlou)
// Sharpening
#define SharpenEdge 0.2
#define Sharpen_val0 2
#define Sharpen_val1 ((Sharpen_val0-1) / 8.0)
float4 main( float2 tex : TEXCOORD0 ) : COLOR {
// Retrieves the original pixel
float4 ori = tex2D(s0, tex);
// Calculates blurred
float4 c1 = tex2D(s0,
float4 c2 = tex2D(s0,
float4 c3 = tex2D(s0,
float4 c4 = tex2D(s0,
float4 c5 = tex2D(s0,
float4 c6 = tex2D(s0,
float4 c7 = tex2D(s0,
float4 c8 = tex2D(s0,

image
tex +
tex +
tex +
tex +
tex +
tex +
tex +
tex +

(gaussian blur)
float2(-dx,-dy));
float2(0,-dy));
float2(dx,-dy));
float2(-dx,0));
float2(dx,0));
float2(-dx,dy));
float2(0,dy));
float2(dx,dy));

// gaussian blur filter


// [ 1, 2 , 1 ]
// [ 2, 4 , 2 ]
// [ 1, 2 , 1 ]
// In order to normalize values, we have to divide by the sum of the coe
fficients
// 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;
// The blurred image is substracted from the original image
float4 cori = CoefOri*ori - CoefFlou*flou;
// Edges detection

//
//
//
//
c1
c2
c3
c4
c5
c6
c7
c8

Retrieves the 9
[ c1, c2 , c3
[ c4,ori , c5
[ c6, c7 , c8
= tex2D(s0, tex
= tex2D(s0, tex
= tex2D(s0, tex
= tex2D(s0, tex
= tex2D(s0, tex
= tex2D(s0, tex
= tex2D(s0, tex
= tex2D(s0, tex

"neighbours"
]
]
]
+ float2(-px,-py));
+ float2(0,-py));
+ float2(px,-py));
+ float2(-px,0));
+ float2(px,0));
+ float2(-px,py));
+ float2(0,py));
+ float2(px,py));

// Using Sobel filter


// Horizontal gradient
// [ -1, 0 ,1 ]
// [ -2, 0, 2 ]
// [ -1, 0 ,1 ]
float delta1 = (c3 + 2*c5 + c8)-(c1 + 2*c4 + c6);
// Vertical gradient
// [ -1,- 2,-1 ]
// [ 0, 0, 0 ]
// [ 1, 2, 1 ]
float delta2 = (c6 + 2*c7 + c8)-(c1 + 2*c2 + c3);
// Calculation
if (sqrt( mul(delta1,delta1) + mul(delta2,delta2)) > SharpenEdge) {
// If edge, sharpening
//return float4(1,0,0,0);
return ori*Sharpen_val0 - (c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8
) * Sharpen_val1;
} else {
// Else, image fixed
return cori;
}
}

You might also like