![]() |
Blending
Hi,
ich versuche gerade zu verstehen was die Blendfunktion in OpenGL glBlendFunc(GL_SRC_ALPHA, GL_ONE); anders macht als meine Softwareroutine:
Delphi-Quellcode:
Ich möchte gerne das selbe in einem Pixelbuffer ohne OpenGL realisieren, aber irgendwie gelingt mir das nicht. Hat jemand eine Idee?
function blend_additive(a, b: cardinal): cardinal;
var a2, b2, carry, r: cardinal; begin // Mask of high bits a2 := a and $7F7F7F7F; b2 := b and $7F7F7F7F; r := a2 + b2; // Do addition of most bits // Now saturate // Check if at least two out of the three high bits are set carry := ((a and b and r) or (not(a xor b xor r) and ((a or b) or r))) and $80808080; // Convert 0x80 to 0xFF carry := carry or (carry - (carry shr 7)); // Put back any high bits taken out carry := carry or ((a or b) and $80808080); result := r or carry; end; |
AW: Blending
Such mal in der DP nach AlphaBlend, ob Dir da etwas hilft (das bezieht sich aber dann direkt auf Canvas-Bearbeitungen).
Ansonsten beschreib mal noch kurz, was Du mit der Funktion erreichen willst. |
AW: Blending
Danke, Alphablending ist etwas anderes.
Delphi-Quellcode:
Das ist nicht das Problem. Additive ist etwas anderes:
function Scale32(const scale: Byte; const p: cardinal): cardinal;
var ag, rb: cardinal; sag, srb: cardinal; begin ag := (p and $FF00FF00) shr 8; rb := p and $00FF00FF; sag := scale * ag; srb := scale * rb; sag := sag and $FF00FF00; srb := srb shr 8 and $00FF00FF; result := sag or srb; end; function blend_alpha(src, tgt: cardinal): cardinal; var alpha, invalpha: Byte; begin alpha := (tgt shr 24) and $FF; invalpha := $FF - alpha; result := Scale32(alpha, tgt) + Scale32(invalpha, src); end; ![]() |
AW: Blending
Ich bin alles andere als ein Profi was OpenGL oder Blending angeht aber kann mans nicht so machen?
Delphi-Quellcode:
// Nur RGB, ohne Alpha (lässt sich aber erweitern bei Bedarf)
function AdditiveBlend(A,B: Cardinal): Cardinal; begin Result := Min((A and $FF) + (B and $FF), $FF) or (Min(((A shr 8) and $FF) + ((B shr 8) and $FF), $FF) shl 8) or (Min(((A shr 16) and $FF) + ((B shr 16) and $FF), $FF) shl 16); end; |
AW: Blending
Das was du vermutlich machen möchtest ist fast\gleiche wie mit GDI+
Wenn dem so ist dann geht das über eine ColorMatrix oder mit Compositing Mode.
Delphi-Quellcode:
Vielleicht kannst du dir dort etwas abschauen.
// Initialize the color matrix.
// Notice the value 0.8 in row 4, column 4. ColorMatrix: TColorMatrix = ((1.0, 0.0, 0.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0, 0.0), (0.0, 0.0, 1.0, 0.0, 0.0), (0.0, 0.0, 0.0, 0.5, 0.0), (0.0, 0.0, 0.0, 0.0, 1.0)); gruss |
AW: Blending
Der Kommentar passt aber auch nicht ganz zum Inhalt ;)
Zitat:
|
AW: Blending
Zitat:
Delphi-Quellcode:
So sollte es eigentlich stimmen (nicht getestet).
function Blend(const src, dst: Cardinal): Cardinal;
var src_rgba: TRGBQuad absolute src; dst_rgba: TRGBQuad absolute dst; res_rgba: TRGBQuad absolute Result; begin res_rgba.a := Min(src.a*src.a div 255 + dst.a, 255); res_rgba.r := Min(src.a*src.r div 255 + dst.r, 255); res_rgba.g := Min(src.a*src.g div 255 + dst.g, 255); res_rgba.b := Min(src.a*src.b div 255 + dst.b, 255); end; Was dein Code da macht, da habe ich überhaupt keine Ahnung. Das scheint auf den ersten Blick extrem hyper-optimiert zu sein. Aber wenn es nicht funktioniert, dann ist es vielleicht doch nicht so clever. Ich wüsste aber persönlich auch nicht, wie man die Multiplikation nur durch boolsche Operationen ersetzen können sollte, alleine deshalb bin ich etwas skeptisch gegenüber deinem Code. Das kann meiner Meinung nach so nicht funktionieren, aber falls doch, dann wäre ich sehr gespannt zu erfahren, wie. |
AW: Blending
Zitat:
Aber das ist letztendlich die Position die für den Alpha Wert zuständig ist. gruss |
AW: Blending
Liste der Anhänge anzeigen (Anzahl: 2)
Danke für die Antworten. Ich hab mal die Werte der geposteten Routinen mit meiner gegengetestet. Das ist ziemlich das gleiche. Dennoch schaut es unter OpenGL leuchtender aus.
|
AW: Blending
In OpenGL ist ja auch noch ein Glow-Effekt und ich glaube auch noch ein Gradient in der Farbe.
Das hat soweit ich das beurteilen kann nichts mit dem blenden zu tun |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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