Sign in to follow this  
Gavin Williams

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

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

[CODE]Texture2D<uint> gTileMap;[/CODE]

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 ..

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

Thanks for your help.

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