This is the shader code:
sampler TextureSampler : register(s0);
Texture2D<float4> xSpecularMap;
Texture2D<float4> xNormalMap;
float3 xLightPosition;
float4 xLightColor;
uint xWidth;
uint xHeight;
sampler Sampler =
sampler_state
{
Texture = xNormalMap;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = CLAMP;
AddressV = CLAMP;
AddressW = CLAMP;
};
float4 main(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
{
float4 tex = tex2D(TextureSampler, texCoord);
float3 texC3;
texC3.x = texCoord.x * xWidth;
texC3.y = texCoord.y * xHeight;
texC3.z = 0;
float4 shadingResult = float4(0,0,0,0);
float4 normal = xNormalMap.Sample(Sampler, texCoord) - float4(.5,.5,.5,.5);
float specular = xSpecularMap.Sample(Sampler, texCoord).r;
float3 displacement = normalize(xLightPosition.xyz - texC3);
float intensity = dot(normal.xyz, displacement);
//shadingResult += intensity * xLightColor;
float3 halfvector = normalize((displacement + float3(0,0,-1)) / 2);
float specintensity = max(0, dot(normal.xyz, halfvector));
shadingResult = specintensity * xLightColor;
return specintensity; //tex * shadingResult * color;
}
technique Light
{
pass Pass1
{
PixelShader = compile ps_2_0 main();
}
}
The key area starts around line 40. specular is the R value of a passed-in specular map, which is correct and has stuff in it (this is what I see if I pass it straight through):

And if I pass through only the calculated intensity of the specular light, this is what I see:

But if I return the simple product of these two floats, all I see is black with an extremely faint circle at the location of the light, even if I augment the shading intensity hundredfold.
Thanks in advance for any advice.






