if anyone has a radeon 9800 lying around (or similar) you could try thr tv smartshader
http://www.beyond3d.com/content/articles/85/4
heres the shader code :
shader copyPixelShader =
"!!ARBfp1.0
TEMP pixel;
OUTPUT oColor = result.color;
TEX pixel, fragment.texcoord[0], texture[0], 2D;
MOV oColor, pixel;
END";
shader vOffsetPixelShader =
"!!ARBfp1.0
OUTPUT oColor = result.color;
PARAM temp = { 0,0,0,0 };
TEMP temp0;
MOV temp0, temp;
SIN temp0.y,program.local[0].y;
ADD temp0, temp0, fragment.texcoord[0];
FRC temp0.y, temp0.y;
TEX oColor, temp0, texture[0], 2D;
END";
shader vBreakupPixelShader =
"!!ARBfp1.0
OUTPUT oColor = result.color;
PARAM temp = { 0,0,0,0 };
PARAM temp1 = { 0.05,0,0,0 };
TEMP temp0;
MOV temp0, temp;
ADD temp0.x, fragment.texcoord[0].y, program.local[0].x;
FRC temp0.x, temp0.x;
TEX temp0, temp0, texture[1], 2D;
MUL temp0, temp1, temp0;
MUL temp0.x, temp0.x, program.local[0].y;
ADD temp0, temp0, fragment.texcoord[0];
FRC temp0.x, temp0.x;
TEX oColor, temp0, texture[0], 2D;
END";
shader vScreenPixelShader =
"!!ARBfp1.0
PARAM scale = {0.8, 0.8, 0.8, 0.0};
PARAM scale2 = {0.2, 0.2, 0.2, 0.0};
PARAM offset = {0.2, 0.0, 0.0, 0.0};
PARAM white = {1.0, 1.0, 1.0, 1.0};
TEMP pixel;
TEMP pixel2;
TEMP pixel3;
TEMP coord;
OUTPUT oColor = result.color;
TEX pixel, fragment.texcoord[0], texture[0], 2D;
ADD coord, fragment.texcoord[0], offset;
FRC coord, coord;
TEX pixel2, coord, texture[0], 2D;
MUL pixel2, pixel2, scale2;
MUL pixel, pixel, scale;
ADD pixel, pixel2, pixel;
TEX pixel2, fragment.texcoord[0], texture[1], 2D;
ADD coord, fragment.texcoord[0], program.local[0];
FRC coord, coord;
TEX pixel3, coord, texture[1], 2D;
MOV pixel3.r, pixel3.a;
MOV pixel3.g, pixel3.a;
MOV pixel3.b, pixel3.a;
MUL pixel3, pixel3, program.local[1];
ADD pixel3, pixel3, white;
MUL pixel, pixel3, pixel;
MUL pixel, pixel2, pixel;
MOV oColor, pixel;
END";
shader vScreenColor=
"!!ARBfp1.0
PARAM YIQ1 = {0.299, 0.587, 0.114, 0.0};
PARAM inverse_YIQ1 = {1.0, 0.956, 0.621, 0.0};
PARAM inverse_YIQ2 = {1.0, -0.272, -0.647, 0.0};
PARAM inverse_YIQ3 = {1.0, -1.105, 1.702, 0.0};
PARAM scale = {0.0, 0.2, 0.0, 0.0};
TEMP pixel;
TEMP coord;
TEMP green;
OUTPUT oColor = result.color;
TEX pixel, fragment.texcoord[0], texture[0], 2D;
DP3 pixel.rgb, pixel, YIQ1;
MOV pixel.gb, scale;
DP3 green.g, pixel, inverse_YIQ1;
DP3 green.r, pixel, inverse_YIQ2;
DP3 green.b, pixel, inverse_YIQ3;
MOV oColor, green;
END";
timeTillVerticalShift = 1000;
verticalShiftCycleLength = 200;
numOfTurns= 3;
curFrameNum = swapNumber % timeTillVerticalShift;
if (curFrameNum < verticalShiftCycleLength)
{
vOffset= 4*(numOfTurns * curFrameNum) /verticalShiftCycleLength;
}
else
{
vOffset= 0;
}
vOffsetPixelShader.constant[0] = {vOffset/3,vOffset,0,0};
surface temp = allocsurf(width, height);
texture[0].source = backbuffer;
destination temp;
apply vOffsetPixelShader;
timeTillBreakup = 450;
breakupShiftCycleLength = 50;
numOfTurns= 4;
breakupPower=1;
curFrameNum = swapNumber % timeTillBreakup;
if (curFrameNum < breakupShiftCycleLength)
{
breakup= (numOfTurns * curFrameNum) /breakupShiftCycleLength;
}
else
{
breakup= 0;
breakupPower=0;
}
vBreakupPixelShader.constant[0] = {breakup/7,breakupPower,0,0};
load_texture(1, 256, 16, 1, "ubyte", "noise.raw");
surface temp1 = allocsurf(width, height);
texture[0].source = temp;
destination temp1;
apply vBreakupPixelShader;
texture[0].source = temp1;
destination temp;
apply vScreenColor;
curFrameNum = ((swapNumber )% 7)/7;
curFrameNum2 = ((swapNumber )% 9)/9;
curFrameNum3 = ((swapNumber )% 600);
CycleLength=200;
if (curFrameNum3 < (CycleLength/2))
{
Noise= curFrameNum3/(CycleLength/2)*0.8;
}
else if (curFrameNum3 < CycleLength)
{
Noise= 1-((curFrameNum3-CycleLength/2)/(CycleLength/2))*0.8;
}
else
{
Noise=0;
}
curFrameNum3 = ((swapNumber )% 90)/90;
vScreenPixelShader.constant[0] = {curFrameNum,curFrameNum2,0,0};
vScreenPixelShader.constant[1] = {Noise,Noise,Noise,1};
load_texture(1, 256, 256, 1, "ubyte", "lines.raw");
texture[1].magfilter = "linear";
texture[0].source = temp;
destination temp1;
apply vScreenPixelShader;
texture[0].source = temp1;
destination backbuffer;
apply copyPixelShader;