Einzelnen Beitrag anzeigen

OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#2

Re: Alphablending mit MMX / SSE Befehle

  Alt 13. Dez 2003, 14:57
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat