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

Started by
2 comments, last by MJP 11 years, 10 months ago
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.'
Advertisement
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!).
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.
Ah right sorry, I forgot to mention that you can't use Sample.

This topic is closed to new replies.

Advertisement