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

Aktuelle Zeit: Mi Apr 24, 2024 17:30

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



Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: AlphaBlending mit Texturen
BeitragVerfasst: Do Nov 20, 2014 21:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe folgenden Code, welcher eine Bitmap mit Alphablending darstellt.
Bit ist eine TBitmap im 32bit Format.
So wie der Code da steht funktioniert die Alphablending.
Aber die Zeile mit "if Result.Data" gefällt mir nicht, mir scheint, da mache ich etwas überflüssiges.

Code:
  1. type
  2.   TTexturData = record
  3.     Width, Height: integer;
  4.     Data: array of GLuint;
  5.   end;
  6.  
  7. function TForm1.GetData(Bit: TBitmap): TTexturData;
  8. var
  9.   x: integer;
  10.   y: integer;
  11. begin
  12.   Result.Width := Bit.Width;
  13.   Result.Height := Bit.Height;
  14.   SetLength(Result.Data, Result.Width * Result.Height);
  15.   for x := 0 to Result.Width - 1 do begin
  16.     for y := 0 to Result.Height - 1 do begin
  17.       Result.Data[y * Result.Width + x] := Bit.Canvas.Pixels[x, y];
  18.       if Result.Data[y * Result.Width + x] <> 0 then begin
  19.         Result.Data[y * Result.Width + x] += $FF000000;
  20.       end;
  21.     end;
  22.   end;
  23. end;    
  24.  
  25.  
  26. procedure InitScene;
  27. begin
  28.   .....
  29.   glEnable(GL_BLEND);
  30.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  31.   .....
  32.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, Pointer(Data));
  33.   .....
  34. end;


Fragment-Shader:
Code:
  1. #version 330
  2.  
  3. in vec2 UV0;
  4.  
  5. uniform sampler2D Sampler0;
  6.  
  7. out vec4 FragColor;
  8.  
  9. void main()
  10. {
  11.   FragColor = texture( Sampler0, UV0 );
  12. }    

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Mo Jan 05, 2015 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich komme der Lösung immer näher, zuerst hatte ich:
Code:
  1. function TForm1.GetData(Bit: TBitmap): TTexturData;
  2. var
  3.   x: integer;
  4.   y: integer;
  5. begin
  6.   Result.Width := Bit.Width;
  7.   Result.Height := Bit.Height;
  8.   SetLength(Result.Data, Result.Width * Result.Height);
  9.  
  10.   if Bit.PixelFormat = pf32bit then begin
  11.     Move(Bit.RawImage.Data^, Result.Data[0], Length(Result.Data) * 4);
  12.   end;
  13. end;    

Dies klappte nur mit 32Bit Bitmaps.

Nun mache ich einen Umweg über TLazIntfImage, da hatte es mit allen 8/24/32Bit BMP/PNG, die ich getestet habe geklappt.
Code:
  1. function TForm1.GetData(Bitmap: TBitmap): TTexturData;
  2. var
  3.   x: integer;
  4.   y: integer;
  5.   Img: TLazIntfImage;
  6. begin
  7.   Result.Width := Bitmap.Width;
  8.   Result.Height := Bitmap.Height;
  9.   SetLength(Result.Data, Result.Width * Result.Height);
  10.  
  11.   case Bitmap.PixelFormat of
  12.     pf24bit, pf32bit: begin
  13.       Img := TLazIntfImage.Create(0, 0);
  14.       Img.LoadFromBitmap(Bitmap.Handle, Bitmap.MaskHandle);
  15.       with Result do begin
  16.         for y := 0 to Height - 1 do begin
  17.           for x := 0 to Width - 1 do begin
  18.             Result.Data[y * Width + x] :=
  19.               (Img.Colors[x, y].red shr 8) +
  20.               (Img.Colors[x, y].green shr 8) shl 8 +
  21.               (Img.Colors[x, y].blue shr 8) shl 16 +
  22.               (Img.Colors[x, y].alpha shr 8) shl 24;
  23.           end;
  24.         end;
  25.       end;
  26.  
  27.       Img.Free;
  28.     end;
  29.   end;
  30. end;      

Nur das mit den shl und shr Befehlen gefällt mir nicht richtig, ich hätte lieber eine Lösung mit Move.
Das Problem dabei red/green/etc. sind 16Bit, besser wäre es wen die 8Bit währen.

Code:
  1. Result.Data[y * Width + x] := Img.Pixels[x, y];

Geht leider nicht, obwohl Pixels ein Integer ist.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Mo Jan 05, 2015 17:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

mit 24bit sollte das genauso gehen. Guck dir mal die Properties vom RawImage an, da steht drin wie genau du die Bits schieben musst, bzw wo welche Farbkanäle in den Daten liegen. Das sollte eigentlich ein ganz normales RGB8 (oder BGR8) sein, was du direkt auf die Graka laden kannst. Internal Format wäre dann GL_RGB8 und das Datenformat wäre GL_UNSIGNED_BYTE.
Oder du nimmst einfach die glBitmap (ich weiß ich nerv :mrgreen: )

MfG Bergmann.

_________________
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 05, 2015 18:40 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
mit 24bit sollte das genauso gehen. Guck dir mal die Properties vom RawImage an

Beziehtt sich das auf TBitmap ?

Wen ja, für 24Bit hatte ich eine billige Lösung, welche auch klappte.
Code:
  1.         pf24bit: begin
  2.           format := GL_RGBA;
  3.           for y := 0 to ty - 1 do begin
  4.             for x := 0 to tx - 1 do begin
  5.               Data[y * tx + x].i := longword(Bitmap.Canvas.Pixels[x, y]) or $FF000000;
  6.             end;
  7.           end;
  8.         end;


Nur damit ist das Problem mit den 8Bit PNGs nicht gelöst, da Lazarus die in eine 32Bit Bitmap umwandelt, bei denen der Alpha-Kanl fehlerhaft ist.
Aber für 24Bit Images könnte ich auf RawImage zugreifen, wäre ein bisschen effizienter als mit den 4 Data-Zeilen.

_________________
OpenGL


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

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Warum willst du denn unbedingt auf TBitmap? Eine 32bit TBitmap hat auch kein Alpha-Kanal, das ist eingach ein XRGB8 (wobei X undefiniert ist). Wenn du die Daten einfach nur auf die Graka laden willst, dann ist RawImage genau das richtige, die hat den Datenstrom und beschreibt wie genau die Daten formatiert sind. Jetzt musst du prüfen ob das Format indem die Daten vorliegen von OpenGL so gelesen werden kann, oder ob du das vorher noch konvertieren musst. Genau das macht die glBitmap auch. Kleines Beispiel:
Code:
  1. var
  2.   bmp: TBitmap;
  3.   raw: TRawImage;
  4.   desc: TRawImageDescription;
  5.  
  6. //TBitmap hat ein RawImage, welches wiederrum ein Description hat, welches beschreibt wie die Daten im RAM liegen.
  7. raw := bmp.RawImage;
  8. desc := raw.Description;
  9.  
  10. //Description weiß wie breit ein Farb-Kanal ist und welches Bit-Offset er hat
  11. desc.RedPrec     // bsp.:  8
  12. desc.RedShift    // bsp.:  0
  13. desc.GreenPrec   // bsp.:  8
  14. desc.GreenShift  // bsp.:  8
  15. desc.BluePrec    // bsp.:  8
  16. desc.BlueShift   // bsp.: 16
  17. desc.AlphaPrec   // bsp.:  0
  18. desc.AlphaShift  // bsp.:  0
  19.  
  20. // dieses Beispiel wäre ein RGB8, welches du dann als Textur laden kannst
  21. glTexImage2D(GL_TEXTURE_2D, GL_RGB8, desc.Width, desc.Height, 0, GL_RGB, GL_UNSIGNED_BYTE, raw.Data);


Bei deine, Code-Schnipsel für die 24bit TBitmap konvertierst du die Daten extra nochmal, das ist aber unnötig, da die schon in einem Format vorliegen, welches von deiner Graka gelesen werden kann, nähmlich GL_RGB8 mit GL_UNSIGNED_BYTE (siehe oben). Jedes Pixel einzelm konvertieren frisst haufen Rechenzeit und ist eigentlich total unnötig beim laden der Texturen. Im Normalfall speichert man die Texturen so ab, das man sie 1 zu 1 auf die Graka laden kann.

_________________
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 05, 2015 21:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Genau, dies habe ich gesucht :D :wink:

Wen man weis wie, sieht das Ganze auf einmal recht einfach aus.

Die oben beschriebene Formate gehen jetzt alle.
Code:
  1. procedure TForm1.LoadTexture(Bitmap: TBitmap);
  2. var
  3.   internalformat, format: GLuint;
  4. begin
  5.   glGenTextures(1, @textureID0);
  6.   glBindTexture(GL_TEXTURE_2D, textureID0);
  7.  
  8.   Writeln(Bitmap.PixelFormat);
  9.   Writeln(Bitmap.RawImage.Description.AlphaPrec);
  10.   Writeln(Bitmap.RawImage.Description.AlphaShift);
  11.  
  12.   with Bitmap.RawImage do begin
  13.     if Description.AlphaPrec = 8 then begin
  14.       internalformat := GL_RGBA;  //   32 Bit
  15.     end else begin
  16.       internalformat := GL_RGB8;  //   24 Bit
  17.     end;
  18.     if Description.AlphaShift = 24 then begin
  19.       format := GL_BGRA;   // mit Alpha
  20.     end else begin
  21.       format := GL_BGR;    // ohne Alpha
  22.     end;
  23.     glTexImage2D(GL_TEXTURE_2D, 0, internalformat, Description.Width, Description.Height, 0, format, GL_UNSIGNED_BYTE, Bitmap.RawImage.Data);
  24.  
  25.     glGenerateMipmap(GL_TEXTURE_2D);
  26.   end;
  27. end;


Zitat:
Eine 32bit TBitmap hat auch kein Alpha-Kanal
Bei Canvas.Pixels nicht, aber bei RawImage ist er vorhanden.

_________________
OpenGL


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

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hattest du nicht gesagt dass das Alpha zerstört wurde? Da muss es ja irgendwo beim laden abhanden gekommen sein. Der Umweg über TBitmap ist eh unsinnig. Die PNG-Klasse in Lazarus hat ein eigenes RawImage, das genauso funktioniert. Eigentlich hat so ziemlich jedes Grapic in Lazarus ein RawImage. Das ist ja das tolle daran ;)

Noch was ist mir aufgefallen. Der Code mag jetzt so funktionieren wie du ihn dort hast, aber was ist wenn AlphaPrec = 8 und AlphaShift = 0 ist (das würde dem Format ABGR oder ARGB entsprechen)? Dann ist dein InternalFormat GL_RGBA und dein Format ist GL_BGR und das passt nicht zusammen. Außerdem, wenn du weißt das es BGRA8 ist, dann sollte das InternalFormat auch GL_RGBA8 sein. GL_RGBA geht zwar auch, aber das muss nicht immer der Fall sein.

Das besste ist du baust dir eine LookUpTable in der alle gängigen Kombinationen von Prec und Shift auf die entsprechenden OpenGL Konstanten verweisen (Format, InternalFormat und DataFormat). Ich kann's nicht oft genug sagen. Guck dir die glBitmap an, die macht genau das. Die hat mehrere sogenannte FormatDescriptoren, die wissen welches Format welche Eigenschaften hat. Anhand dieser Eigenschaften kann das Format der geladenen Daten bestimmt werden und dann mit den entsprechenen OpenGL Konstanten an die Graka übergeben werden.
Ist das immer noch zu wenig dokumentiert, oder willst du lieber was eigenes bauen? Aber selbst wenn du was eigenes bauen willst, ein Blick darein kann nicht schaden.

_________________
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: Di Jan 06, 2015 17:54 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Der Code mag jetzt so funktionieren wie du ihn dort hast, aber was ist wenn AlphaPrec = 8 und AlphaShift = 0 ist (das würde dem Format ABGR oder ARGB entsprechen)?
Verstehe ich das richtig, bei TBitmap sind die Daten immer als BGR oder BGRA abgespeichert, aber wen ich direkt TRawImage auslese, könnte sein sein, das die Daten als ABGR oder sonst irgendwie vorhanden sind ?

Bei einem Test mit Delphi gab es bei den 8Bit Images pf8bit, Lazarus hat alles auf pf32bit umgewandelt.

Das internalformat sagt die Bit-Breite der Daten-Array, in meinem Fall 24 oder 43Bit ?
Das format sagt, wie die Reihenfolge der Bytes in der Array sind ?

Ich habe den Code ein bisschen modifiziert.
Code:
  1. procedure TForm1.LoadTexture(RawImage: TRawImage);
  2. var
  3.   internalformat, format: GLuint;
  4.   Error: boolean;
  5. begin
  6.   Error := False;
  7.  
  8.   with RawImage do begin
  9.  
  10.     Writeln(Description.AlphaPrec);
  11.     Writeln(Description.AlphaShift);
  12.  
  13.     case Description.AlphaPrec of
  14.       0: begin
  15.         internalformat := 3; // 24Bit
  16.       end;
  17.       8: begin
  18.         internalformat := 4; // 32Bit
  19.       end;
  20.       else begin
  21.         Error := True;
  22.       end;
  23.     end;
  24.     case Description.AlphaShift of
  25.       0: begin
  26.         format := GL_BGR;   // ohne Alpha
  27.       end;
  28.       24: begin
  29.         format := GL_BGRA;  // mit Alpha
  30.       end;
  31.       else begin
  32.         Error := True;
  33.       end;
  34.     end;
  35.     if not Error then begin
  36.       glGenTextures(1, @textureID0);
  37.       glBindTexture(GL_TEXTURE_2D, textureID0);
  38.       glTexImage2D(GL_TEXTURE_2D, 0, internalformat, Description.Width, Description.Height, 0, format, GL_UNSIGNED_BYTE, RawImage.Data);
  39.       glGenerateMipmap(GL_TEXTURE_2D);
  40.     end;
  41.   end;
  42. end;  


Zitat:
 Ich kann's nicht oft genug sagen. Guck dir die glBitmap an, die macht genau das.

Das mit der Tabelle finde ich eine gute Idee, ich werde dies später genauer angucken.
Ein bisschen habe ich in den 10'000 Zeilen gesehen.
Irgendwie finde ich es recht übertrieben, fast 10'000 Zeilen Code um eine Bitmap in die GraKa zu bringen, wen man das mit weniger als 30 Zeilen lösen kann.

Kann ich mit glTexImage2D ziemlich alle Grafikformate in die GraKa laden ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Di Jan 06, 2015 18:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
mathias hat geschrieben:
Verstehe ich das richtig, bei TBitmap sind die Daten immer als BGR oder BGRA abgespeichert, aber wen ich direkt TRawImage auslese, könnte sein sein, das die Daten als ABGR oder sonst irgendwie vorhanden sind ?
TBitmap kann kein Alpha. 32Bit wäre RGBX8, 24Bit RGB8, 16Bit RGBX4 und 8bit Luminance8. (Sofern ich das noch richtig im Kopf habe). Und ja, RawImage kann alles sein, das sagt ja schon der Name. Rein theoretisch könnte man damit auch sowas wie G8B5R7A3 machen, aber das braucht kein Mensch :mrgreen:

mathias hat geschrieben:
Das internalformat sagt die Bit-Breite der Daten-Array, in meinem Fall 24 oder 43Bit ?
Das format sagt, wie die Reihenfolge der Bytes in der Array sind ?
Richtig. GL_RGBA8 sagt RGBA mit jeweils 8Bit pro Kanal. GL_RGBA sagt das erst Rot, dann Grün, Blau und Alpha kommt. Wichtig ist aber auch das DatenFormat. GL_UNSIGNED_BYTE sagt das die Daten als Byte übergeben werden, also 4 aufeinanderfolgende Byte sind ein Pixel. 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. Das Zusammenspiel von allen 3 Formaten ist wichtig!

mathias hat geschrieben:
Ich habe den Code ein bisschen modifiziert.
Internal Format sollte schon eine OpenGL Konstante sein. Das ist zwar so zugelassen, aber Magic Numbers sind böse! Geändert hat sich jetzt aber auch nix, außer das du das gleiche Format anders benannt hast. Ich frag mal anders: Was macht dein alter Code, wenn AlphaPrec = 8 und AlphaShift = 0 ist? Genau, Format wird GL_BGR und InternalFormat ist GL_RGBA (bzw. GL_RGBA8) und das passt nicht zusammen.

mathias hat geschrieben:
Das mit der Tabelle finde ich eine gute Idee, ich werde dies später genauer angucken.
Ein bisschen habe ich in den 10'000 Zeilen gesehen.
Irgendwie finde ich es recht übertrieben, fast 10'000 Zeilen Code um eine Bitmap in die GraKa zu bringen, wen man das mit weniger als 30 Zeilen lösen kann.
Eine Library kann meistens mehr als man benötigt, weil sie allgemein gehalten ist, sodass sie auf möglichst viele Anwendungsfälle passt. Die Zuordnung des richtigen Formats zu den gegebenen Daten ist dabei der kleinere Teil der glBitmap. Der Hauptteil sind die Lade-Routinen für die Datein und für die Nachbearbeitung. Die brauchst du für deinen Fall nicht. Wenn du die nicht nutzt werden die vom Compiler bzw. vom Linker auch nicht mit in deine EXE übernommen. Es hat also keinerlei Nachteil für dich, wenn du so eine Lib nutzt (außer vlt. das der Kompiler 10 Millisekunden länger übersetzten muss als deine 30 Zeilen^^)
Du musst dir ja auch nicht die 10000 Zeilen angucken. Es reicht wenn du die Bsp. durcharbeitest und dir evtl. noch die beiligende Doku anguckst, da sollte alles drin stehen was du zum arbeiten mit der glBitmap benötigst. Dich intressiert ja eigentlich nur wie du die Klassen nutzen musst, nich wie genau die implementiert sind.

mathias hat geschrieben:
Kann ich mit glTexImage2D ziemlich alle Grafikformate in die GraKa laden ?
Fast. Die glBitmap kann zur Zeit 60 Formate die von OpenGL unterstützt werden und da geht sicher noch das ein oder andere mehr. Unter OpenGL ES sind es ein paar weniger, da hier nicht alle Formate unterstützt werden. In dem Fall muss man sich wirklich die Mühe machen und die Daten vor dem Hochladen auf die Graka entsprechend konvertieren. Aber wie oben schon gesagt nimmt man im Normalfall Texturen die schon in einem unterstützden Format vorliegen.

_________________
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: Di Jan 06, 2015 19:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Erstmal danke für die vielen Infos.

Ich habe mir TRawImage genauer angeguckt. http://lazarus-ccr.sourceforge.net/docs ... ption.html
Mit diesen Infos müsste ich eigentlich ermitteln können, was in format und internalformat reinkommt.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Mi Jan 07, 2015 22:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Irgendwo muss noch ein grober Fehler sein, unter Linux, egal welche Datei ich lade, die Textur bleibt schwarz. :evil:

PS:

Zitat:
aber Magic Numbers sind böse!

Ja die sind sehr böse, darum lief es nicht mit Linux.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AlphaBlending mit Texturen
BeitragVerfasst: Do Jan 08, 2015 17:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Der Umweg über TBitmap ist eh unsinnig. Die PNG-Klasse in Lazarus hat ein eigenes RawImage, das genauso funktioniert. Eigentlich hat so ziemlich jedes Grapic in Lazarus ein RawImage. Das ist ja das tolle daran

Ich habe es gerade mit TPortableNetworkGraphic getestet, das RawImage scheint indentisch mit dem von TBitmap zu sein, auch bei den 8-Bit PNGs.
Kennt jemand ein Format bei dem etwas anderes als 24 oder 32Bit rauskommt. Oder bei dem RGB und BGR vertauscht ist ?
Zum testen währe sowas noch praktisch,

_________________
OpenGL


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

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Definier dir doch selbst ne RawImage. Du kannst die Daten und Eigenschaften der RawImage selbst setzten und gucken ob er das richtig geladen wird.

_________________
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: Do Jan 08, 2015 21:18 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Jetzt sehe ich langsam durch, das format sagt, wie die Rawdaten vorliegen, entweder 24 oder 32Bit.
internalformat sagt OpenGL, bei 32Bit, ob das 4. Byte einen Alpha-Kanal darstellt oder ob es ignoriert werden soll, dann kommt bei Shader eine 1.0 an.
Das Ganze bezieht sich auf meine getesteten BMP und PNGs, welche in den RawDaten als 24 oder 32Bit vorliegen.

Somit habe ich das etwas falsche behauptet:
Zitat:
Das internalformat sagt die Bit-Breite der Daten-Array, in meinem Fall 24 oder 43Bit ?
Das format sagt, wie die Reihenfolge der Bytes in der Array sind ?


Code:
  1.     case Description.BitsPerPixel of
  2.       24: begin
  3.         format := GL_BGR;          // 24 Bit Data
  4.         internalformat := GL_RGB8; // ohne Alpha
  5.       end;
  6.       32: begin
  7.         format := GL_BGRA;         // 32 Bit Data
  8.         case Description.AlphaPrec of
  9.           0: begin
  10.             internalformat := GL_RGB8;   // ohne Alpha
  11.           end;
  12.           8: begin
  13.             internalformat := GL_RGBA8;  // mit Alpha
  14.           end;
  15.           else begin
  16.             Error := True;
  17.           end;
  18.         end;
  19.       end;
  20.       else begin
  21.         Error := True;
  22.       end;
  23.     end;
  24.     if not Error then begin
  25.       glGenTextures(1, @textureID0);
  26.       glBindTexture(GL_TEXTURE_2D, textureID0);
  27.       glTexImage2D(GL_TEXTURE_2D, 0, internalformat, Description.Width, Description.Height, 0, format, GL_UNSIGNED_BYTE, Data);
  28.  
  29.       glGenerateMipmap(GL_TEXTURE_2D);
  30.     end else begin
  31.       ShowMessage('Ungültiges Format');
  32.     end;
  33.  


Zitat:
Definier dir doch selbst ne RawImage. Du kannst die Daten und Eigenschaften der RawImage selbst setzten und gucken ob er das richtig geladen wird.
Das werde ich bei Gelegenheit machen. Ich kann eine einfache ByteArray an glTexImage2D übergeben und gucken was passiert.

_________________
OpenGL


Zuletzt geändert von mathias am Fr Jan 09, 2015 19:58, insgesamt 1-mal geändert.

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

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

jetzt hast du's total verdreht. Vorher war es richtig:
  • Format - welche Farbkanäle es gibt und wie die Reihenfolge ist (das hat rein gar nix mit der BitBreite zu tun!!!). Bsp: GL_RGB, GL_BGR, GL_RGBA, GL_BGRA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, ...
  • InternalFormat - wie breit ist jeder Farbkanal ist (die Angaben sind meißtens in bit) Bsp.: GL_RGB8, GL_RGBA8, GL_RGBA4, GL_RGB10_A2, ...
  • DataFormat - wie genau liegen die Daten im RAM Bsp.: GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_INT_10_10_10_2, ...

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!

MfG Bergmann.

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


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 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 44 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 3.126s | 17 Queries | GZIP : On ]