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