Alpha blending with 16-bit frame buffers
[PlayStation 2]
When reading from a 16-bit frame buffer the colors are converted
from 5bit to 8bit by left shifting 3bits. When writing back, the
dithering matrix value is added before right shifting 3bits.
Unfortunately if the dithering matrix contains negative values the
write back operation is not the inverse of the read operation and
this produces the artifacts described. They should be removed by
setting a dithering matrix with no negative values in it using:
This is a renderstate, and can be set before rendering problem
objects. Note that pixels with an alpha of zero will be written to
the framebuffer effectively applying a second dither to the frame
buffer. Another approach is to turn ditthering off for the problem
artwork.