Jump to content
  • Advertisement
Sign in to follow this  

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

This topic is 1760 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!