Jump to content
  • Advertisement
Sign in to follow this  
Gavin Williams

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

This topic is 2232 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

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

Share this post

Link to post
Share on other sites
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!).

Share this post

Link to post
Share on other sites
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.

Share this post

Link to post
Share on other sites
Ah right sorry, I forgot to mention that you can't use Sample.

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

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

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!