Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Blending (https://www.delphipraxis.net/192219-blending.html)

Peter666 30. Mär 2017 09:33

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:
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;
Ich möchte gerne das selbe in einem Pixelbuffer ohne OpenGL realisieren, aber irgendwie gelingt mir das nicht. Hat jemand eine Idee?

stahli 30. Mär 2017 10:15

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.

Peter666 30. Mär 2017 12:41

AW: Blending
 
Danke, Alphablending ist etwas anderes.

Delphi-Quellcode:
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;
Das ist nicht das Problem. Additive ist etwas anderes: http://www.learnopengles.com/tag/additive-blending/

Neutral General 30. Mär 2017 12:56

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;

EWeiss 30. Mär 2017 14:18

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:
  // 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));
Vielleicht kannst du dir dort etwas abschauen.

gruss

bra 30. Mär 2017 15:04

AW: Blending
 
Der Kommentar passt aber auch nicht ganz zum Inhalt ;)

Zitat:

Zitat von EWeiss (Beitrag 1365998)
// 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));


Namenloser 30. Mär 2017 15:08

AW: Blending
 
Zitat:

Zitat von Peter666 (Beitrag 1365947)
glBlendFunc(GL_SRC_ALPHA, GL_ONE)

Naja, also ich sage mal ganz banal:

Delphi-Quellcode:
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;
So sollte es eigentlich stimmen (nicht getestet).

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.

EWeiss 30. Mär 2017 15:10

AW: Blending
 
Zitat:

Der Kommentar passt aber auch nicht ganz zum Inhalt
Jep habe den wert bei mir geändert.
Aber das ist letztendlich die Position die für den Alpha Wert zuständig ist.

gruss

Peter666 30. Mär 2017 15:18

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.

Neutral General 30. Mär 2017 15:21

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 17:33 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz