I've tried a few different approaches before, but right now my preferred one is this: don't do a brightpass at all. Instead, raise the original colour to some power, greyscale the result, then multiply the original colour by that result. I find that it gives a nice smooth transition between boomed parts of the scene and non-bloomed parts, and preserves the original colour balance perfectly.
okeys, this is interesting. so what you suggest is something like this (pixelshader ...pre blur pass pseudo code)?
powColor.r=inColor.r * inColor.r //i thought of using x^n with n=2 because pow() seems expensive? pls comment on this! :)
powColor.r=inColor.g * inColor.g
powColor.r=inColor.b * inColor.b
greyscale = (powColor.r +.powColor.b +powColor.g)/3 //calculate the arithmetic mean value (i think graphics guys refer to this as luminance, right?)
inColor *= greyscale //rescale the original color
this results in texture data which can be fed to the rest of the effect pipeline (the blurs and combining) just like the brightpass.
is this what you had in mind? or did i get something wrong?