AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Alphablending mit MMX / SSE Befehle
Thema durchsuchen
Ansicht
Themen-Optionen

Alphablending mit MMX / SSE Befehle

Ein Thema von schty · begonnen am 13. Dez 2003 · letzter Beitrag vom 2. Jun 2005
 
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, 13: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz