Mein letzter Alphablending-Algorithmus sieht so aus:
Code:
__asm {
pxor MM7, MM7; // Zero MM7
movd MM0, dtarget; // Get Target
movd MM1, dsource; // Get Source
movd MM2, dalpha; // Alpha packed
movd MM3, d255; // 255 für jedes Byte
punpcklbw MM0, MM7;// Target unpacked
punpcklbw MM1, MM7;// Source unpacked
punpcklbw MM2, MM7;// Alpha unpacked
punpcklbw MM3, MM7;// 255 unpacked
pmullw MM1, MM2; // Multiply source with alpha
pmullw MM3, MM0; // Multiply target with 255
pmullw MM0, MM2; // Multiply target with alpha
psubusw MM3, MM0;// subtract a*tr from ...
paddusw MM1, MM3; // Add target*255 to source*alpha
psrlw MM1,8; // Right shift target by 8 (divide by 256)
packuswb MM1, MM7; // pack target to MM7
movd dtarget, MM1;
EMMS;
}
Ich musste allerdings feststellen, dass ein Ausmultiplizieren der Funktion keinen Geschwindigkeitsunterschied bringt (bzw. nur im Mikrosekundenbereich für das gesamte Bild).
Da meine Routine mehr Anweisungen verwendet, müsste sie langsamer sein als deine - Wie schnell ist denn deine?
Meine braucht für ein 256x256-Bild (mit Perpixelalpha und zusätzlichem konstantem Alpha) etwa 4650µs auf meinem Athlon XP 2100+.
Um auf deine Frage zu kommen, noch schneller geht's wahrscheinlich nur, wenn du die Arbeit den 3D-Chip machen lässte ;c)
Was ich noch anmerken möchte: Auf die Formel
Zitat:
Result = Alpha * (Foreground - Background) + Background
bin ich auch gekommen, und sie ist korrekt für Werte zwischen 0 und 1. Wenn du aber Werte von 0 bis 255 hast, sieht das ganze so aus:
Code:
Result = Alpha * Source + (255 - Alpha) * Target
Result = Alpha * Source + 255 * Target - Alpha * Target
Result = Alpha * (Source - Target) + 255 * Target
Und das finde ich in deinem Code nicht wieder. Wenn ich mich recht entsinne, habe ich es mal mit "deiner" Formel ausprobiert und es hat zu unbefriedigenden Ergebnissen geführt.