AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Blending

Ein Thema von Peter666 · begonnen am 30. Mär 2017 · letzter Beitrag vom 31. Mär 2017
Antwort Antwort
Seite 1 von 2  1 2   
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

Blending

  Alt 30. Mär 2017, 10:33
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?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Blending

  Alt 30. Mär 2017, 11:15
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#3

AW: Blending

  Alt 30. Mär 2017, 13:41
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/
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Blending

  Alt 30. Mär 2017, 13:56
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;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Blending

  Alt 30. Mär 2017, 15:18
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

Geändert von EWeiss (11. Jul 2019 um 16:47 Uhr)
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Blending

  Alt 30. Mär 2017, 16:04
Der Kommentar passt aber auch nicht ganz zum Inhalt

// 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));
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Blending

  Alt 30. Mär 2017, 16:08
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Blending

  Alt 30. Mär 2017, 16:10
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
  Mit Zitat antworten Zitat
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#9

AW: Blending

  Alt 30. Mär 2017, 16:18
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.
Miniaturansicht angehängter Grafiken
screenshot-2017-03-30-um-16.15.02.png   screenshot-2017-03-30-um-16.15.22.png  
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Blending

  Alt 30. Mär 2017, 16:21
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:04 Uhr.
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