Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Apr 28, 2024 21:53

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Fr Jan 09, 2015 20:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Und in deinem Code ist immer noch ein Denkfehler. Kleines Bsp.: Zeile 10. Dort wäre Format = GL_BGRA und InternalFormat = GL_RGB8, das passt nicht zusammen!

Wo liegt der Denkfehler ?
Lazarus wandelt beim laden alle PNGs in 32Bit um, egal ob Alpha-Blending vorhanden ist, auch ist es egal, ob sie nur 8Bit/per Pixel haben.
Ohne Alpha-Blending werden nur 24Bit von 32Bit genutzt, die restlichen 8Bit sind undefiniert.
AlphaPrec verrät mit, ob die 8Bit Alphawerte sind oder ob sie undefiniert sind.

Ich sehe keinen Fehler, da der Code funktioniert. :|

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Fr Jan 09, 2015 20:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Für deine Test mit deiner Datei mag das jetzt gehen, aber für andere Formate liefert der Code nicht die erwarteten Formate. Geh doch mal Zeile für Zeile durch und guck was der da macht.
Du machst anhand der Bit-Breite eines Pixels das Format fest. Auf Anhieb fallen mir sofort 2 Formate ein die 24bit breit sind: RGB8 und BGR8. Du nimmst einfach an das es BGR8 ist, ohne das zu prüfen. Das gleiche gilt für 32bit. Es gibt viele verschiedene 32bit Formate. Nicht jedes 32bit Format ist automatisch BGRA8. Wenn du ein 32bit Format erkennst setzt du Format auf GL_BGRA und danach guckst du erst ob dein Bild überhaupt einen Alpha-Kanal hat. Wenn AlphaPrec jetzt 0 ist, dann setzt du InternalFormat auf GL_RGB8 (Format ohne Alpha) was aber im Wiederspruch zu deinem gesetzten Format (GL_BGRA - mit Alpha) steht. Das funktioniert nur, weil du das mit Bildern testest die entweder BGR8 oder BGRA8 sind. Mit allen anderen Formaten funktioniert der Code nicht.
Mit einem case lässt sich das auch schwer lösen. Wie schon gesagt du brauchst ne LookUpTable in der steht welche Formate du für welche Image-Eigenschaften benötigst. Die Formate sind von folgenden 8 Werten abhängig: RedPrec, RedShift, GreenPrec, GreenShift, BluePrec, BlueShift, AlphaPrec, AlphaPrec. Folgende Eigenschaften resultieren aus der Kombination von diesen Werten: Format, InternalFormat, DataFormat. Du brauchst also eine LookUpTable die (RedPrec, RedShift, GreenPrec, GreenShift, BluePrec, BlueShift, AlphaPrec, AlphaShift) nach (Format, InternalFormat, DataFormat) überführt. Das könnte wie folgt aussehen:

Code:
  1. type
  2.   TLookUpTableEntry = packed record
  3.     RedPrec, RedShift, GreenPrec, GreenShift, BluePrec, BlueShift, AlphaPrec, AlphaPrec: Cardinal;
  4.     Format, InternalFormat, DataFormat: GLenum;
  5.   end;
  6.  
  7. const
  8.   FORMAT_LUT: array[0..0] of TLookUpTableEntry = (
  9.     (
  10.        RedPrec   = 8,
  11.        GreenPrec = 8,
  12.        BluePrec  = 8,
  13.        AlphaPrec = 8,
  14.        
  15.        RedShift   = 0,
  16.        GreenShift = 8,
  17.        BlueShift  = 16,
  18.        AlphaShift = 24,
  19.        
  20.        Format         = GL_RGBA,
  21.        InternalFormat = GL_RGBA8,
  22.        DataFormat     = GL_UNSIGNED_BYTE
  23.     )
  24.   );
Dann kannst du mit einer Schleife die Tabelle durchgehen und die erwarteten Werte mit den gegebenen Werden aus der RawImage vergleichen. Wenn alle Werte übereinstimmen hast du das richtige Format gefunden und du kannst die Formate für deine OpenGL funktion übernehmen.
Und nochmal: das ist alles genau so wie ich das gerade beschrieben hab in der glBitmal drin (zumindest die Idee, die Implementierung ist etwas anders). Einfach mal reingucken.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Sa Jan 10, 2015 18:40 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Für meine 3 verschieden Image-Typen habe ich es jetzt mit einer Tabelle gemacht.
Wen noch andere Typen dazu kommen, kann ich einfach die Array vergrössern.
Code:
  1. type
  2.   TDescription = packed record
  3.     RPrec, RShift,
  4.     GPrec, GShift,
  5.     BPrec, BShift,
  6.     APrec, AShift: byte;
  7.   end;
  8.  
  9.   TGLformat = packed record
  10.     InternalFormat: TGLint;
  11.     Format: TGLenum;
  12.     DataFormat: TGLenum;
  13.   end;
  14.  
  15.   TLookUpTableEntry = packed record
  16.     Description: TDescription;
  17.     GLformat: TGLformat;
  18.   end;
  19.  
  20.  
  21. var
  22.   FORMAT_LUT: array[0..2] of TLookUpTableEntry = (
  23.  
  24.     // 32Bit mit Alpha
  25.     (Description: (RPrec: 8; RShift: 16; GPrec: 8; GShift: 8; BPrec: 8; BShift: 0; APrec: 8; AShift: 24);
  26.     GLformat: (InternalFormat: GL_RGBA8; Format: GL_BGRA; DataFormat: GL_UNSIGNED_BYTE)),
  27.  
  28.     // 32Bit ohne Alpha
  29.     (Description: (RPrec: 8; RShift: 16; GPrec: 8; GShift: 8; BPrec: 8; BShift: 0; APrec: 0; AShift: 24);
  30.     GLformat: (InternalFormat: GL_RGB8; Format: GL_BGRA; DataFormat: GL_UNSIGNED_BYTE)),
  31.  
  32.     // 24Bit
  33.     (Description: (RPrec: 8; RShift: 16; GPrec: 8; GShift: 8; BPrec: 8; BShift: 0; APrec: 0; AShift: 0);
  34.     GLformat: (InternalFormat: GL_RGB8; Format: GL_BGR; DataFormat: GL_UNSIGNED_BYTE)));
  35.  
  36.  
  37. procedure TForm1.LoadTexture(RawImage: TRawImage);
  38. var
  39.   TabNr, i: integer;
  40. begin
  41.   with RawImage.Description do begin
  42.     Caption :=
  43.       '  BitsPerPixel:' + IntToStr(BitsPerPixel) + #13#10 +
  44.  
  45.       '  RedPrec:     ' + IntToStr(RedPrec) + #13#10 +
  46.       '  RedShift:    ' + IntToStr(RedShift) + #13#10 + #13#10 +
  47.       '  GreenPrec:   ' + IntToStr(GreenPrec) + #13#10 +
  48.       '  GreenShift:  ' + IntToStr(GreenShift) + #13#10 + #13#10 +
  49.       '  BluePrec:    ' + IntToStr(BluePrec) + #13#10 +
  50.       '  BlueShift:   ' + IntToStr(BlueShift) + #13#10 + #13#10 + #13#10 +
  51.       '  AlphaPrec:   ' + IntToStr(AlphaPrec) + #13#10 +
  52.       '  AlphaShift:  ' + IntToStr(AlphaShift) + #13#10 + #13#10;
  53.   end;
  54.   Writeln(Caption);  // Testausgabe
  55.  
  56.   TabNr := -1;
  57.   for i := 0 to Length(FORMAT_LUT) - 1 do begin
  58.     with RawImage.Description, FORMAT_LUT[i].Description do begin
  59.       if (RPrec = RedPrec) and (RShift = RedShift) and (GPrec = GreenPrec) and (GShift = GreenShift) and
  60.         (BPrec = BluePrec) and (BShift = BlueShift) and (APrec = AlphaPrec) and (AShift = AlphaShift) then begin
  61.         TabNr := i;
  62.         Break;
  63.       end;
  64.     end;
  65.   end;
  66.  
  67.   if TabNr <> -1 then begin
  68.     glGenTextures(1, @FID);
  69.     glBindTexture(GL_TEXTURE_2D, FID);
  70.     with RawImage.Description, FORMAT_LUT[TabNr].GLformat do begin
  71.       glTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, Width, Height, 0, Format, DataFormat, RawImage.Data);
  72.     end;
  73.     glGenerateMipmap(GL_TEXTURE_2D);
  74.   end else begin
  75.     ShowMessage('Undefiniertes Format');
  76.   end;
  77. end;  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Sa Jan 10, 2015 20:32 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Es würde auch GL_UNSIGNED_INT_8_8_8_8 gehen, das wäre die Byte-Reihenfolge wegen little Endianess genau verdreht, also ABGR8.

Mit GL_UNSIGNED_INT_8_8_8_8_REV geht es.
Wird GL_UNSIGNED_INT_8_8_8_8 bei Java gebraucht, ich hatte mal mit Java Probleme, als ich float einlesen wollte, die ich vorher mit Pascal gespeichert hatte ?

Ich habe dazu gerade eine chinesische Seite gefunden: http://milkpot.sakura.ne.jp/gl/textureformat.html

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: So Jan 11, 2015 00:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Jo, jetzt sieht's schon besser aus. Aufgräumt, gut nachvollziehbar und leicht erweiterbar...

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: So Jan 11, 2015 18:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Es hat schon eine kleine Änderung gegeben, ich muss noch BitsPerPixel abfragen. Unter Linux werden JPGs anders geladen als unter Windows.


Code:
  1.     // 32Bit ohne Alpha ( Linux JPG )
  2.     (Description: (Bits: 32; RPrec: 8; RShift: 16; GPrec: 8; GShift: 8; BPrec: 8; BShift: 0; APrec: 0; AShift: 0);
  3.     GLformat: (InternalFormat: GL_RGB8; Format: GL_BGRA; DataFormat: GL_UNSIGNED_BYTE)),
  4.  
  5. ...
  6.  
  7.       if (Bits = BitsPerPixel) and
  8.         (RPrec = RedPrec) and...

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: So Jan 11, 2015 23:07 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe da Formate gefunden, welche im Wiki nicht vorhanden sind.

Code:
  1. glTexImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, GetWidth(), GetHeight(), 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, data );

Gefunden: http://lists.apple.com/archives/mac-ope ... 00107.html

In dglOpenGL.pas sind sie vorhanden.
Code:
  1.   // GL_APPLE_ycbcr_422
  2.   GL_YCBCR_422_APPLE = $85B9;
  3.   GL_UNSIGNED_SHORT_8_8_APPLE = $85BA;
  4.   GL_UNSIGNED_SHORT_8_8_REV_APPLE = $85BB;
  5.   GL_RGB_RAW_422_APPLE = $8A51;


Sind das Exoten, das dies nicht im Wiki sind ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Mo Jan 12, 2015 01:49 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Da das von Apple ist, würde ich sagen: ja ;)

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Mo Jan 12, 2015 19:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Jeder der OpenGL auf seiner Hardware implementiert hat die Möglichkeit eigene Extensions dort einzubauen, die die Core Funktionalitöt von OpenGL mit entsprechenden Funktionen erweitert. Von diesen Extensions gibts es einige. Im Normalfall haben die Konstanten einer Extension immer den Hersteller als Endung, also sowas sie _EXT, _NV, _ATI, _APPLE, ...
Wenn die Extension sich bewährt kann es sein das diese irgendwann in den OpenGL Core übernommen wird. z.B. VBOs waren früher auch nur ne Extension. Wenn man so ne Extension nutzen will sollte man vorher checken ob diese auch von der Hardware unterstrützt wird. Im DGL Header gibt es einige Booleans dafür, in deinem Fall sollte das GL_APPLE_ycbcr_422 sein.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Mo Jan 12, 2015 22:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
mathias hat geschrieben:
Ich habe da Formate gefunden, welche im Wiki nicht vorhanden sind.

Code:
  1. glTexImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, GetWidth(), GetHeight(), 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, data );

Gefunden: http://lists.apple.com/archives/mac-ope ... 00107.html

In dglOpenGL.pas sind sie vorhanden.
Code:
  1.   // GL_APPLE_ycbcr_422
  2.   GL_YCBCR_422_APPLE = $85B9;
  3.   GL_UNSIGNED_SHORT_8_8_APPLE = $85BA;
  4.   GL_UNSIGNED_SHORT_8_8_REV_APPLE = $85BB;
  5.   GL_RGB_RAW_422_APPLE = $8A51;


Sind das Exoten, das dies nicht im Wiki sind ?


Ja, weils die Extensions nur unter MacOSX gibt, und die Abdeckung damit entsprechend gering ist.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Fr Jan 16, 2015 21:01 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wen ich folgender Code ausführe und dabei eine 32Bit Bmp lade, wird der Alpha-Kanal vernichtet.
Somit steckt in Pixels irgendwo ein Alpha-Kanal.

Kann es sein, das TBitmap mit Alpha umgehen kann, aber dies (noch) fehlerhaft macht ?

Code:
  1. procedure TForm1.MenuItem1Click(Sender: TObject);
  2. var
  3.   Pic: TPicture;
  4.   PNG: TPortableNetworkGraphic;
  5.  
  6.  
  7.   procedure Filter(Bitmap: TBitmap);
  8.   var
  9.     x, y: integer;
  10.   begin
  11.     for x := 0 to Bitmap.Width div 2 do begin
  12.       for y := 0 to Bitmap.Height do begin
  13.         Bitmap.Canvas.Pixels[x, y] := $FF;
  14.       end;
  15.     end;
  16.   end;
  17.  
  18.  
  19. begin
  20.   if OpenDialog1.Execute then begin
  21.     if UpCase(ExtractFileExt(OpenDialog1.FileName)) = '.PNG' then begin
  22.       PNG := TPortableNetworkGraphic.Create;
  23.       PNG.LoadFromFile(OpenDialog1.FileName);
  24.       TexID := LoadTexture(PNG.RawImage);
  25.       PNG.Free;
  26.       MenuItem1.Caption := 'png';
  27.     end else begin
  28.       Pic := TPicture.Create;
  29.       Pic.LoadFromFile(OpenDialog1.FileName);
  30.       Filter(Pic.Bitmap);  // Alpha-Kanal wird vernichtet
  31.       TexID := LoadTexture(Pic.Bitmap.RawImage);
  32.       Pic.Free;
  33.       MenuItem1.Caption := 'anderes';
  34.     end;
  35.   end;
  36. end;    

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Fr Jan 16, 2015 21:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
mathias hat geschrieben:
Wen ich folgender Code ausführe und dabei eine 32Bit Bmp lade, wird der Alpha-Kanal vernichtet.
Somit steckt in Pixels irgendwo ein Alpha-Kanal.

Kann es sein, das TBitmap mit Alpha umgehen kann, aber dies (noch) fehlerhaft macht ?
   [/code]


Klar, und auch nicht fehlerhaft. Zumindest in Delphi wrappt TBitmap nur das Bitmap des OS, und 32 Bit BMPs sind Standard. Man muss dann halt nur das richtige Pixelformat (32 Bit) wählen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Di Mär 31, 2015 21:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe unterdessen eine Package für Lazarus gefunden. BGRABitmap

Diese macht das Händling mit Bitmaps um einiges leichter.
Volle Unterstützung des Alpha-Kanales.

Somit hat es auch ein neues Format für meine obige Bibliothek gegeben.
Die Liste wird immer länger. :mrgreen: :wink:

Code:
  1.     // 32Bit mit Alpha ( Linux / Unit BGRABitmap )
  2.     (Description: (Bits: 32; RPrec: 8; RShift: 0; GPrec: 8; GShift: 8; BPrec: 8; BShift: 16; APrec: 8; AShift: 24);
  3.     GLformat: (InternalFormat: GL_RGBA8; Format: GL_RGBA; DataFormat: GL_UNSIGNED_BYTE)),

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.029s | 15 Queries | GZIP : On ]