Does alpha blending shall be gamma corrected?

Started by
5 comments, last by Ashaman73 11 years, 7 months ago
Hi.I`m doing gamma correction for our game recently, and it works well on the opaque objects. But when I use alpha blend, especially the add blend, I found the result was brighter than blending in the SRGB space and some soft edges became sharp. Because the SRGB add blend result in linear space was (SRGB0 + SRGB1*alpha)^2.2 , when change to linear blend, it became to SRGB0^2.2 + SRGB1^2.2*alpha . To fix this problem, a lot of textures must been modified, it`s terrible... So my question is, SRGB space and linear space,which is the correct way to do alpha blending? How did other games solved this problem?
Advertisement
Which API are you using?

IIRC, D3D9 does all it's blending without taking sRGB into account (which means it's incorrectly blending in gamma-space), but D3D10 does it correctly (i.e. decodes the texture to linear, blends, re-encodes to sRGB).

IIRC, D3D9 does all it's blending without taking sRGB into account (which means it's incorrectly blending in gamma-space), but D3D10 does it correctly (i.e. decodes the texture to linear, blends, re-encodes to sRGB).


Having spent a lot of time this year looking into sRGB issuesI can confirm this :)

Which API are you using?

IIRC, D3D9 does all it's blending without taking sRGB into account (which means it's incorrectly blending in gamma-space), but D3D10 does it correctly (i.e. decodes the texture to linear, blends, re-encodes to sRGB).


Thank you for replying,I`m using D3D9. Does this mean that if I don`t want to modify the textures, I can`t do gamma correction on the transparent objects?
That's not quite true for D3D9, it actually depends on the hardware. DX10+ hardware will do the blending in linear space, while older DX9 hardware will do the blending in sRGB space. There's even a cap bit for it: D3DPMISCCAPS_POSTBLENDSRGBCONVERT. Unfortunately you can only check that cap if you're using an Ex device on Vista or Win7, and there's no way to turn it off. So if you use frame buffer gamma correction, it's possible that your game will look different on DX9 and DX10 hardware. The only safe thing to do is to manually perform sRGB conversion at the end of your pixel shader, in which case you get consistent behavior on both platforms.

That's not quite true for D3D9, it actually depends on the hardware. DX10+ hardware will do the blending in linear space, while older DX9 hardware will do the blending in sRGB space. There's even a cap bit for it: D3DPMISCCAPS_POSTBLENDSRGBCONVERT. Unfortunately you can only check that cap if you're using an Ex device on Vista or Win7, and there's no way to turn it off. So if you use frame buffer gamma correction, it's possible that your game will look different on DX9 and DX10 hardware. The only safe thing to do is to manually perform sRGB conversion at the end of your pixel shader, in which case you get consistent behavior on both platforms.


Thanks a lot!
Valve has a publication about this issue over here.

This topic is closed to new replies.

Advertisement