Jump to content

  • Log In with Google      Sign In   
  • Create Account

Problem with texture ( R8_UInt ) .. can't get data in shader.


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 Gavin Williams   Members   -  Reputation: 664

Like
0Likes
Like

Posted 07 June 2012 - 09:57 PM

Hi all,

I want to use textures with UInt formats but I can't get them to work. Here is the texture description, and the dataBox write call in my gfx update
method :

			Texture2DDescription textureDesc = new Texture2DDescription()
			{
				ArraySize = 1,
				CpuAccessFlags = SlimDX.Direct3D11.CpuAccessFlags.Write,
				Width = Width,
				Height = Height,
				OptionFlags = ResourceOptionFlags.None,
				BindFlags = BindFlags.ShaderResource,
				Format = SlimDX.DXGI.Format.R8_UInt,
				MipLevels = 1,
				Usage = ResourceUsage.Dynamic,
				SampleDescription = new SampleDescription(1, 0),
			};

	 	   ...

	 	   dataBox.Data.Write((byte)sysResource[sRIndex]); // where sysResource is a UInt32[]

So at this point I should have a byte-array style texture with values of 0 and 255 striped across the texture (which ive done elsewhere using %, and this all works if i use the floating point textures.

The pixel shader is very simple ...

float4 PShader(PSIN input) : SV_Target
{
	 float4 color = float4(0,0,0,1);

	 uint value = gTileMap.Sample(PointSampler, input.uvCoord);

	 if (value == 0)	 // so show any zero values in texture as red
	   	 color.r = 1;
	 return color;
}

All I am getting is a texture full of red ! which I just don't understand. Where is the data that I've put into it ?

Can anyone identify what I'm doing wrong or am I not realizing something about UInt textures ? Maybe about the way that they ACTUALLY store data is different than what I would expect, or is there something peculiar about the Sampler and how it returns values ?

Edit : This is taken from Practical Rendering and Computation with Direct3D11 :

'The return type of a sample method depends on the DXGI_FORMAT specified creating the shader resource view bound for the texture object. Thus, DXGI_FORMAT_R32G32B32A32_FLOAT will return a float4, DXGI_FORMAT_R32G32_UINT will return a uint2, and DXGI_FORMAT_R8G8B8A8_UNORM will return a float4.'

Edited by Gavin Williams, 07 June 2012 - 10:05 PM.


Sponsor:

#2 MJP   Moderators   -  Reputation: 11359

Like
0Likes
Like

Posted 07 June 2012 - 10:23 PM

A Texture2D object in HLSL also has a return type associated with it. The default is float4. You can use a float return type for FLOAT, UNORM, or SNORM DXGI formats, since those formats specify that the value sampled should be floating point. For UINT formats you need to declare your Texture2D with a uint return type, like this:

Texture2D<uint> gTileMap;

If you don't do this there will be a silent error that's only reported if you create your device with the DEBUG flag (which you should always do for debug builds!).

#3 Gavin Williams   Members   -  Reputation: 664

Like
0Likes
Like

Posted 08 June 2012 - 12:35 AM

Fantastic, thank you MJP.

So following your advice i declared the texture with

Texture2D<uint> gTileMap;

This does not work by itself throwing - error X4582: cannot sample from non-floating point texture formats.

So In order to access a uint texture, the Texture.Sample() function does not work, instead, after reading another post in which MJP suggested using Load or [] with integer formats. I found the following to work ..

uint value = gTileMap.Load(int3(input.uvCoord*gTileMapWidth,0));

Thanks for your help.

#4 MJP   Moderators   -  Reputation: 11359

Like
0Likes
Like

Posted 08 June 2012 - 01:14 AM

Ah right sorry, I forgot to mention that you can't use Sample.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS