I'm having a hell of a time getting an L16 texture (16bit heightfield data) read in my shader and was hoping someone could spot where I'm going wrong.
I'm pretty sure the logic is just some syntax issue in my shader, but just to verify I ran everything through RenderDoc and I can see the load call being executed, however it always returns 0. I've tried a few values to no avail, checking the pipeline I can see the resource is bound and I can see the values in the resource look correct - the shader just isn't reading it for some reason.
Any thoughts?
Shader:
float4x4 WorldViewProjection : WorldViewProjection;
// Textures
Texture2D<float4> DiffuseTexture;
Texture2D<uint> HeightmapTexture;
float MaxHeight;
// Structures
struct VSInput
{
float4 Position : POSITION;
float2 Uv : TEXCOORD0;
};
struct VSOutput
{
float4 Position : SV_POSITION;
float2 Uv : TEXCOORD0;
};
sampler LinearClampSampler
{
Filter = Min_Mag_Mip_Linear;
AddressU = Clamp;
AddressV = Clamp;
};
sampler PointClampSampler
{
Filter = Min_Mag_Mip_Point;
AddressU = Clamp;
AddressV = Clamp;
};
// Helper Methods
float GetHeightmapValue(float2 uv)
{
uint rawValue = HeightmapTexture.Load(uint3(uv.x, uv.y, 0)); // <- Always returns 0,0,0,0
return ((float)rawValue/(256.0f * 256.0f)) * MaxHeight;
}
// Vertex shaders
VSOutput ForwardRenderVS(VSInput IN)
{
VSOutput Out = (VSOutput)0;
float3 position = IN.Position.xyz;
position.y = GetHeightmapValue(IN.Uv);
Out.Position = mul(float4(position, 1.0f), WorldViewProjection);
Out.Uv = IN.Uv;
return Out;
}
// Fragment shaders.
float4 ForwardRenderFP(VSOutput In) : FRAG_OUTPUT_COLOR0
{
return float4(0.0f, 1.0f, 0.0f, 0.0f);
}
// Render states.
BlendState NoBlend
{
BlendEnable[0] = FALSE;
RenderTargetWriteMask[0] = 15;
};
BlendState LinearBlend
{
BlendEnable[0] = TRUE;
SrcBlend[0] = SRC_ALPHA;
DestBlend[0] = INV_SRC_ALPHA;
BlendOp[0] = ADD;
SrcBlendAlpha[0] = ZERO;
DestBlendAlpha[0] = ZERO;
BlendOpAlpha[0] = ADD;
BlendEnable[1] = FALSE;
RenderTargetWriteMask[0] = 15;
};
DepthStencilState DefaultDepthState
{
DepthEnable = TRUE;
DepthWriteMask = All;
DepthFunc = Less;
StencilEnable = FALSE;
};
RasterizerState DefaultRasterState
{
CullMode = None;
};
RasterizerState CullBackRasterState
{
CullMode = Front;
};
// Techniques.
technique11 ForwardRender
{
pass pass0
{
SetVertexShader( CompileShader( vs_4_0, ForwardRenderVS() ) );
SetPixelShader( CompileShader( ps_4_0, ForwardRenderFP() ) );
SetBlendState( NoBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
SetDepthStencilState( DefaultDepthState, 0 );
SetRasterizerState( DefaultRasterState );
}
}