You can use a compute shader and that way you will not have to set up the raster pipeline. With a compute shader, you will need to write to a RWTexture2D, instead of returning an output like a pixel shader, and set up a correct thread count, but it is a lot less work than a vertex shader + pixel shader. A simple example (just from the top of my head, I haven't compiled):
Texture2D<float4> input : register(t0);
SamplerState sam : register(s0);
RWTexture2D<float4> output : register(u0);
[numthreads(8,8,1)]
void main(uint3 DTid : SV_DispatchThreadID)
{
output[DTid.xy] = input.SampleLevel(sam, (float2)DTid.xy / input_texture_resolution.xy, 0);
}
Such a shader will need to be started with a dispatch command:
deviceContext->Dispatch((input_texture_resolution.x + 7) / 8, (input_texture_resolution.y + 7 ) / 8, 1);
The dispatch command takes the input texture resolution and divides by the thread group size, so that each thread will work on a single pixel. +7 is there so that the integer divide doesn't underestimate if the resolution is not divisible by thread group size (which is 8 in this case). Good luck!