It's not really that hard, what you want is a 'quad.fx' shader(one that transforms a plane into the camera view so it fits exactly). Except create 2 extra vertex shaders, one would force the quad to the top half of the screen, the other would force it to the bottom. Thus when rendering split screen you'd create 2 planes, load up the shader twice with the 2 new techniques, render the game or whatever from 2 cameras and apply their render targets to each of the planes and render the main camera(this will then draw the split screen). You can then apply greyscale or whatever effects you like by creating variants of this quad.fx shader that do different things, this doesn't really require a shader expert.
Anyway here's a quad.fx that does this(untested):
float2 screenRes;
texture Texture0
<string resourceName = "";>;
sampler2D diffuseSampler = sampler_state
{
texture = <Texture0>;
mipFilter = linear; magFilter = linear; minFilter = linear;
addressU = clamp; addressV = clamp;
};
//---------------------------------------------------------
// VS.
//---------------------------------------------------------
void Full_VertexShader( float4 iPos : POSITION,
float2 iUV0 : TEXCOORD0,
out float4 oPos : POSITION,
out float2 oUV0 : TEXCOORD0 )
{
oUV0 = iUV0;
iUV0.y = 1.0f - iUV0.y;
iUV0 = iUV0 * 2.0f - 1.0f;
oPos = float4( iUV0.x - ( 1.0f / screenRes.x ),
iUV0.y + ( 1.0f / screenRes.y ), 1.0f, 1.0f );
}
void Top_VertexShader( float4 iPos : POSITION,
float2 iUV0 : TEXCOORD0,
out float4 oPos : POSITION,
out float2 oUV0 : TEXCOORD0 )
{
oUV0 = iUV0;
iUV0.y = 1.0f - iUV0.y;
iUV0 = iUV0 - 1.0f;
oPos = float4( iUV0.x - ( 1.0f / screenRes.x ),
iUV0.y + ( 1.0f / screenRes.y ), 1.0f, 1.0f );
}
void Bottom_VertexShader( float4 iPos : POSITION,
float2 iUV0 : TEXCOORD0,
out float4 oPos : POSITION,
out float2 oUV0 : TEXCOORD0 )
{
oUV0 = iUV0;
iUV0.y = 1.0f - iUV0.y;
iUV0 = iUV0;
oPos = float4( iUV0.x - ( 1.0f / screenRes.x ),
iUV0.y + ( 1.0f / screenRes.y ), 1.0f, 1.0f );
}
//---------------------------------------------------------
// PS.
//---------------------------------------------------------
float4 Basic_PixelShader( float2 iUV0 : TEXCOORD0 ) : COLOR
{
float4 diffuseMap = tex2D( diffuseSampler, iUV0 );
diffuseMap.a = 1.0f;
return diffuseMap;
}
technique Basic_Full
{
pass p0
{
vertexShader = compile vs_2_0 Full_VertexShader();
pixelShader = compile ps_2_0 Basic_PixelShader();
}
}
technique Basic_Top
{
pass p0
{
vertexShader = compile vs_2_0 Top_VertexShader();
pixelShader = compile ps_2_0 Basic_PixelShader();
}
}
technique Basic_Bottom
{
pass p0
{
vertexShader = compile vs_2_0 Bottom_VertexShader();
pixelShader = compile ps_2_0 Basic_PixelShader();
}
}
However I'd ask you raise your prize for an answer by: -$50