uniform float4x4 ViewProj; uniform texture2d image; uniform float2 outputSize; uniform int swap; struct VertData { float4 pos : POSITION; float2 uv : TEXCOORD0; }; VertData VSDefault(VertData vert_in) { VertData vert_out; vert_out.pos = mul(float4(vert_in.pos.xyz, 1.0), ViewProj); vert_out.uv = vert_in.uv; return vert_out; } float4 PSColorFilter(VertData vert_in) : TARGET { uvec2 outputPos = uvec2(vert_in.uv * outputSize); uint fst = outputPos.x * 3u / 4u; vec4 color_0 = texelFetch(image, ivec2(fst, outputPos.y), 0); uint snd = (outputPos.x * 3u + 1u) / 4u; vec4 color_1 = texelFetch(image, ivec2(snd, outputPos.y), 0); uint trd = (outputPos.x * 3u + 2u) / 4u; vec4 color_2 = texelFetch(image, ivec2(trd, outputPos.y), 0); vec4 result = vec4( color_0.barg[outputPos.x % 4u], color_1.gbar[outputPos.x % 4u], color_2.rgba[outputPos.x % 4u], 1.0 ); if (swap == 1) return result.rgba; else return result.bgra; } technique Draw { pass { vertex_shader = VSDefault(vert_in); pixel_shader = PSColorFilter(vert_in); } }