Я думаю, что я очень глуп, потому что я не могу понять, что вызывает проблему в этом простейшем случае.
Тип проекта — Windows OpenGL (на Android проблема также сохраняется).
Вот шейдер:
//----------------------------------------------------------------------------
float4 PSTest (float2 TexCoords : TEXCOORD0) : COLOR0
{
float4 color = float4 (1, 0, 0, 1);
return color;
}
//----------------------------------------------------------------------------
Technique Test
{
pass Test
{
PixelShader = compile psTexture0 PSTest();
}
}
Он отлично работает, если я рисую его на экране с помощью Texture (128x128):
Shader.CurrentTechnique = Shader.Techniques["Test"];
GraphicsDevice.SetRenderTarget (null);
GraphicsDevice.Clear (Color.White);
Batch.Begin (SpriteSortMode.Immediate, BlendState.Opaque,
SamplerState.PointClamp, DepthStencilState.None, null, Shader);
Batch.Draw (Texture, Vector2.Zero, Color.White);
Batch.End();

Теперь я решаю нарисовать его в цели рендеринга Output, созданной кодом:
new RenderTarget2D (GraphicsDevice, 256, 256, false,
SurfaceFormat.Color, DepthFormat.None);
Код рисования:
// Render into Output
Shader.CurrentTechnique = Shader.Techniques["Test"];
GraphicsDevice.SetRenderTarget (Output);
GraphicsDevice.Clear (Color.DimGray);
Batch.Begin (SpriteSortMode.Immediate, BlendState.Opaque,
SamplerState.PointClamp, DepthStencilState.None, null, Shader);
Batch.Draw (Texture, Vector2.Zero, Color.White);
Batch.End();
// Draw Output
GraphicsDevice.SetRenderTarget (null);
GraphicsDevice.Clear (Color.White);
Batch.Begin();
Batch.Draw (Output, Vector2.Zero, Color.White);
Batch.End();
Но результат совершенно абсурден:

Пробовал разные простейшие шейдеры, SurfaceFormat.HdrBlendable, размеры текстур - ничего не помогает.
Также я попытался нарисовать Texture (залитый фиолетовым цветом) в рендер-цель без шейдера (затем на экран), и все работает нормально.

Кажется, я пропустил некоторые основы шейдеров в XNA, но я не могу понять, что это такое.