Alpha blend till "front to back" rendering
Jag har gjort en funktion för alpha blending som skulle vara till front to back (rendera de objekt närmast först altså) rendering men jag fick inte äns den till att funka som vanlig bar to front...
Jag läste i SDL:s dokumentation att det skulle se ut så här ungefär:
Er, Eg, Eb - Element color value
Ea - Element alpha value
Cr, Cg, Cb - Canvas color value (before blending)
Ca - Canvas alpha value (before blending)
Cr', Cg', Cb' - Canvas color value (after blending)
Ca' - Canvas alpha value (after blending)
Ca' = 1 - (1 - Ea) * (1 - Ca)
Cr' = (1 - Ea) * Cr + Er
Cg' = (1 - Ea) * Cg + Eg
Cb' = (1 - Ea) * Cb + Eb
Jag gjorde en funktion av de uträkningarna och den blev så här:
unsigned int blend_ftb( unsigned int source, unsigned int target)
{
unsigned int sourcer = (source >> 0) & 0xff;
unsigned int sourceg = (source >> 8) & 0xff;
unsigned int sourceb = (source >> 16) & 0xff;
unsigned int targetr = (target >> 0) & 0xff;
unsigned int targetg = (target >> 8) & 0xff;
unsigned int targetb = (target >> 16) & 0xff;
float sourcea = ((source >> 24) & 0xff)/255.0;
float targeta = ((target >> 24) & 0xff)/255.0;
targeta = 1 - (1 - sourcea) * (1 - targeta);
targetr = (1 - sourcea) * targetr + sourcer;
targetg = (1 - sourcea) * targetg + sourceg;
targetb = (1 - sourcea) * targetb + sourceb;
if (targetr > 0xff) targetr = 0xff;
if (targetg > 0xff) targetg = 0xff;
if (targetb > 0xff) targetb = 0xff;
unsigned int int_targeta = targeta * 255;
return (targetr << 0) |
(targetg << 8) |
(targetb << 16) |
(int_targeta << 24);
}
Jag vet inte om jag har gjort rätt men matar man in 0x11ffffff, 0xff000000 så får man 0xffffffff vilket borde vara fel eftersom då blandas inte ffffff (helt vit) med 000000 ( helt svart) på rätt sätt
vad är felet?
Fiershold - http://www.fiershold.co.nr