Professional Documents
Culture Documents
sampler s0 : register(s0);
float4 p1 : register(c1);
// Defined values under this row are "optimal" DO NOT CHANGE IF YOU DO NOT KNOW
WHAT YOU ARE DOING!
// Pixel "width"
#define px (p1[0])
#define py (p1[1])
// Colour to greyscale, fast approx gamma
float CtG(float3 RGB) { return sqrt( (1.0/3.0)*((RGB*RGB).r + (RGB*RGB).g +
(RGB*RGB).b) ); }
// Edge detection
// Matrix, relative weights
// [ 1 ]
// [ 4, 4, 4 ]
// [ 1, 4, 4, 4, 1 ]
// [ 4, 4, 4 ]
// [ 1 ]
float edge = length( abs(blur-c0) + abs(blur-c1) + abs(blur-c2) + abs(blur-
c3)
+ abs(blur-c4) + abs(blur-c5) + abs(blur-c6) + abs(blur-
c7) + abs(blur-c8)
+ 0.25*(abs(blur-c9) + abs(blur-c10) + abs(blur-c11) +
abs(blur-c12)) )*(1.0/3.0);
// RGB to greyscale
float c0_Y = CtG(c0);
// Calculate local near min & max, partial cocktail sort (No branching!)
[unroll] // ps_4_0+ does not unroll without this
for (int i = 0; i < 2; ++i)
{
for (int i1 = 1+i; i1 < 25-i; ++i1)
{
float temp = kernel[i1-1];
kernel[i1-1] = min(kernel[i1-1], kernel[i1]);
kernel[i1] = max(temp, kernel[i1]);
}