I am currently implementing a deferred renderer in DX11.1. Right now I am having a problem that I can't seem to crack with specular highlights when I have multiple light sources.
I keep a vector of lights for each scene and the last light rendered has proper spec, but all lights before it are "bad". I think the problem is caused by an improper blend state setting, but I'm not sure. Currently my blend state when rendering lights is
blendDesc.RenderTarget.SrcBlend = D3D11_BLEND_ONE; blendDesc.RenderTarget.DestBlend = D3D11_BLEND_INV_SRC_ALPHA; blendDesc.RenderTarget.SrcBlendAlpha = D3D11_BLEND_ONE; blendDesc.RenderTarget.DestBlendAlpha = D3D11_BLEND_INV_DEST_ALPHA; blendDesc.RenderTarget.BlendOp = blendDesc.RenderTarget.BlendOpAlpha = D3D11_BLEND_OP_ADD; blendDesc.RenderTarget.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
In my G buffer generation I write specular to the G buffer's color map's alpha channel. In hlsl...
output.color.a = _specEm.Sample(linearClamp, input.texcoord).a;
Then in the light accumulator
float4 diffuse = _diffuse.Sample(pointClamp, input.texcoord); // Lighting calculations for diffuse and normal, all good // ... float speci = diffuse.a; float specularLight = speci * pow(saturate(dot(reflectionVector, directionToCamera)), specp); return float4(diffuseLight.rgb, specularLight);
In this scene there are two lights, the first image shows the specular highlight created by the second light rendered
The second image is of the first light rendered in this scene where you can see the spec "badness" (a dim highlight with a darker spot in the middle), in it you can also see the position of the other light
Never mind the light on the boxes, they aren't fully interacting with light at the moment.
Its worth noting that more lights in the scene will have the same effect, all will have the "bad" spec and the last one will have the "good" spec.
I suspect that I am missing something fundamental about how blend states work and losing some of the color that I am writing into the alpha channel, but if anyone out there can see the problem and suggest a fix, I would appreciate it.