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