Sign in to follow this  
MichaelCat

XNA and C# Rendering to a 1x1 texture produces no result.

Recommended Posts

MichaelCat    119

What I am trying to achieve is the following: my pass will return a huge array with several unique numbers repeating over and over, which I need to retrieve and process on CPU.

I tried rendering into a 2000x1 texture and then sampled it on the CPU with RenderTarget2d.GetData<>() and a foreach loop. It was awfully slow smile.png. So I sidestepped my problem, the idea now is to render to a 1x1 texture multiple times. Inbetween passes I will extend a parameter array in my shader to include the numbers already returned.Each pixel will than query the array and clip itself if it holds a number that already appeared.

The problem now is that pixel color never changes nomatter what I render - it always returns some random numbers. When I added `Game.GraphicsDevice.Clear(Color.Transparent);` before the draw call it started returning zeroes, though the shader code should return 0.2f (or its 0 to 255 equivalent). Can it be because I render too small a content into it (I am drawing a line on the screen and sample the scene's color along the line) and it gets lerped at some point?

C#/XNA code:
 




CollisionRT = new RenderTarget2D(Game.GraphicsDevice, 1, 1, false, SurfaceFormat.Color, DepthFormat.None);

...
Game.GraphicsDevice.BlendState = BlendState.AlphaBlend;
Game.GraphicsDevice.SetRenderTarget(CollisionRT);
Game.GraphicsDevice.Clear(Color.Transparent);
Game.GraphicsDevice.DepthStencilState = DepthStencilState.None;

foreach (ModelMesh mesh in PPCBulletInvis.Model.Meshes)
// PPCBulletInvis is a line that covers 1/18 of the screen (approx).
{
foreach (Effect effect in mesh.Effects)
{
//effect.Parameters["Texture"].SetValue(vfTex);
effect.Parameters["halfPixel"].SetValue(halfPixel);
effect.Parameters["sceneMap"].SetValue(sceneRT);
effect.Parameters["World"].SetValue(testVWall.World);
effect.Parameters["View"].SetValue(camera.View);
effect.Parameters["Projection"].SetValue(camera.Projection);
}
mesh.Draw();
}

Game.GraphicsDevice.SetRenderTarget(null);

Rectangle sourceRectangle =
new Rectangle(0, 0, 1, 1);

Color[] retrievedColor = new Color[1];
CollisionRT.GetData<Color>(retrievedColor);

Console.WriteLine(retrievedColor[0].R); // Returns zeroes.


Shader code:
 

float4x4 World;
float4x4 View;
float4x4 Projection;

texture sceneMap;
sampler sceneSampler = sampler_state
{
Texture = (sceneMap);
AddressU = CLAMP;
AddressV = CLAMP;
MagFilter = POINT;
MinFilter = POINT;
Mipfilter = POINT;
};

float2 halfPixel;

struct VS_INPUT
{
float4 Position : POSITION0;
};
struct VS_OUTPUT
{
float4 Position : POSITION0;
float4 ScreenPosition : TEXCOORD2;
};


VS_OUTPUT VertexShaderFunction(VS_INPUT input)
{
VS_OUTPUT output;

float4 worldPosition = mul(input.Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);

output.ScreenPosition = output.Position;
return output;
}

float4 PixelShaderFunction(VS_OUTPUT input) : COLOR0
{
input.ScreenPosition.xy /= input.ScreenPosition.w;

float2 screenTexCoord = 0.5f * (float2(input.ScreenPosition.x,-input.ScreenPosition.y) + 1);

screenTexCoord -=halfPixel;

return (0.2f,0.2f,0.2f,0.2f);//tex2D(sceneSampler, screenTexCoord);
}

technique Technique1
{
pass Pass1
{
VertexShader = compile vs_3_0 VertexShaderFunction();
PixelShader = compile ps_3_0 PixelShaderFunction();
}
}
Edited by cubrman

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this