outline
// Sobel Edge Detector based from ATI Video shader
float sampleDist = 1.0f/512.0f; // distance one pixel in u/v
sampler2D image : register(s0);
static const float2 offsets[8] =
{
-1, -1,
0, -1,
1, -1,
-1, 0,
// 0, 0, // no center pixel
1, 0,
-1, 1,
0, 1,
1, 1,
};
float4 main(
float4 Pos : POSITION,
float2 texCoord: TEXCOORD0) : COLOR
{
int i =0;
float4 c = .5;
float2 texCoords;
float4 texSamples[8];
float4 vertGradient;
float4 horzGradient;
float4 color;
color = tex2D( image, texCoord );
for(i =0; i < 8; i++)
{
texCoords = texCoord + sampleDist * offsets[i]; // add sample offsets stored in c10-c17 (inclusive)
// take sample
texSamples[i] = tex2D( image, texCoords);
// convert to b&w
texSamples[i] = dot(texSamples[i], .333333f);
}
// VERTICAL Gradient
vertGradient = -(texSamples[0] + texSamples[5] + 2*texSamples[3]);
vertGradient += (texSamples[2] + texSamples[7] + 2*texSamples[4]);
// Horizontal Gradient
horzGradient = -(texSamples[0] + texSamples[2] + 2*texSamples[1]);
horzGradient += (texSamples[5] + texSamples[7] + 2*texSamples[6]);
// we could approximate by adding the abs value..but we have the horse power
c = 1 - sqrt( horzGradient*horzGradient + vertGradient*vertGradient );
if ( c.r > 0.4f )
color = c;
return color;
}
