So I put in a load of debugging trace statements into my program. All the resources are being created in the desired format (16bit FP) at the correct resolution.
Next step, I used PIX (most amazing debugging tool ever. Fact.) and stepped through my program and examined every resource after each step. The bright pass results were 0/black, which when fed into the lens effects generates black, which when added to the final image adds nothing - thus no bloom effects.
FACT 1: Bright pass isn't generating results, so no lens effects appear.
After experimenting a bit further I find that if I set the "bright pass threshold" to a value less than 1.0 then I get some content in my bright pass output. If I set it to 0.99 then I get the bright parts as expected, set it to 1.0 and they disappear.
FACT 2: No pixels in the source image have values > 1.0
Now this one really confuses me. I pass in values to my lighting equations that are most definitely > 1.0; which means it must be being clamped on the GPU. The bottom line appears to be that switching from an ATI Radeon 9800 to an Nvidia GeForce 6600 (somewhere) saturates/clamps the values to a [0.0, 1.0] range.
Everyone should know that when the IHV's disagree your only friend is the reference rasterizer.
FACT 3: The reference rasterizer gives me a completely white image, different to both ATI and Nvidia hardware
So, I can only guess that somewhere during development on my ATI machine I've made an assumption or used a feature that only ATI handles "correctly". That is, the ATI drivers are letting me do something that the RefRast says is wrong but I think is correct. Nvidia hardware is just somewhere in the middle - not quite as accurate as the RefRast, and not quite as wrong as the ATI.
One final gripe - PIX doesn't do a good job of debugging HDRI formats. Or rather, it could do a much better job. I'm getting lots of black images and lots of white images - it'd be nice to be able to arbitrarily scale them so I can tell if it's really black or just extremely small values - and for the white areas find out if they are actually 1.0 or are actually > 1.0 and can't be displayed.
So, after I grab something to eat:
- Run the reference rasterizer through PIX and see if I can find out where it goes wrong.
- Check that the reference rasterizer also disagrees with ATI on my other machine (it should do, but this is just a sanity check!)
- Scream, shout and stamp my feet until it works [flaming]
Also found out that due to permissions on this lab machine, I have to set up VC++'s directories each time I log back in. So before I can do any work after lunch I'll have to reconfigure it again. Yay!