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

Aktuelle Zeit: Di Mai 14, 2024 04:16

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Texturdaten mit TBitmap laden
BeitragVerfasst: Mo Nov 17, 2014 20:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich lade bei meinen Texturdaten jedes Pixel einzeln, dieses braucht recht viel Zeit.
Gibt es dafür etwas optimaleres ?

Code:
  1. var  //  Wird für glTexImage2D gebraucht
  2.     Data: packed array of packed record
  3.       case byte of
  4.         0: (r, g, b, a: byte);
  5.         1: (i: GLuint);
  6.         2: (ar: packed array[0..3] of byte);
  7.     end;
  8.  
  9.  
  10. procedure TTexturBuffer.LoadTextures(Bitmap: TBitmap);
  11. var
  12.   tx, ty, x, y: integer;
  13. begin
  14.   tx := Bitmap.Width;
  15.   ty := Bitmap.Height;
  16.   Width := tx;
  17.   Height := ty;
  18.   SetLength(Data, tx * ty);
  19.   for y := 0 to ty - 1 do begin
  20.     for x := 0 to tx - 1 do begin
  21.       Data[y * tx + x].i := Bitmap.Canvas.Pixels[x, (ty - 1) - y];  // Sehr langsm
  22.     end;
  23.   end;
  24. end;  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturdaten mit TBitmap laden
BeitragVerfasst: Mo Nov 17, 2014 20:25 
Offline
DGL Member
Benutzeravatar

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

die glBitmap unterstützt das Laden aus TBitmap und das auch relativ schnell.
Optional kannst du die Textur aber auch gleich aus einer BMP, JPEG, PNG, ... laden.

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: Texturdaten mit TBitmap laden
BeitragVerfasst: Mo Nov 17, 2014 23:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Die glBitmap ist mir etwas zu komplex, ich will lieber etwas selbst machen.

Ich habe unterdessen mit RawImage gepastelt.

Code:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   Bitmap, Bitmap2: TBitmap;
  4.   i: integer;
  5.   j: integer;
  6. const
  7.   anz = 50;
  8. begin
  9.   Bitmap := TBitmap.Create;
  10.   Bitmap.Width := anz;
  11.   Bitmap.Height := anz;
  12.   for i := 0 to anz - 1 do begin
  13.     Bitmap.Canvas.Pixels[i, i] := $FF00;
  14.     Bitmap.Canvas.Pixels[anz - i, i] := $FF;
  15.   end;
  16.   Canvas.Draw(0, 0, Bitmap);
  17.  
  18.   Bitmap2 := TBitmap.Create;
  19.   Bitmap2.Width := Bitmap.Width;
  20.   Bitmap2.Height := Bitmap.Height;
  21.   for i := 0 to (anz - 1) * (anz - 1) * 3 do begin
  22.     Bitmap2.RawImage.Data[i] := Bitmap.RawImage.Data[i];
  23.   end;
  24.   //  Bitmap.RawImage.Data := Bitmap2.RawImage.Data;
  25.   //  Move(Bitmap.RawImage.Data, Bitmap2.RawImage.Data, anz * anz);
  26.  
  27.   for i := 0 to anz - 1 do begin
  28.     Bitmap1.Canvas.Pixels[anz div 2, i] := $FFFF00;
  29.     Bitmap1.Canvas.Pixels[i, anz div 2] := $FFFF;
  30.   end;
  31.  
  32.   Canvas.Draw(0, 0, Bitmap);
  33.   Canvas.Draw(anz + 10, 0, Bitmap2);
  34.  
  35.  
  36.   Bitmap2.Free;
  37.   Bitmap.Free;
  38. end;  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturdaten mit TBitmap laden
BeitragVerfasst: Di Nov 18, 2014 07:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Warum ist dir das zu komplex? NUr so aus Interesse? Vlt kann man die ja noch etwas einfacher gestalten, oder es fehlt einfach die Doku. Du könntest dir trotzdem den Code in der glBitmap ansehen, da steht eigentlich alles drin was du brauchst. Du kannst ja dannnur den Teil dort rauskopieren und an deine Bedürfnisse anpassen.
In deinem 2. Beispiel kopierst du nur die Daten von einer Bitmap in eine andere. Ich denk du willst die Daten in eine Textur laden? :?

_________________
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: Texturdaten mit TBitmap laden
BeitragVerfasst: Di Nov 18, 2014 12:24 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
In deinem 2. Beispiel kopierst du nur die Daten von einer Bitmap in eine andere.

Ja das ist richtig, hier geht es mir darum, wie ich direkt auf die Rohdaten der Bitmap zugreifen kann.
Wen ich das verstanden habe, dann geht es in die Textur-Daten.

Zitat:
Du könntest dir trotzdem den Code in der glBitmap ansehen

Das habe ich gemacht, der Code ist riessig.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturdaten mit TBitmap laden
BeitragVerfasst: Di Nov 18, 2014 15:43 
Offline
DGL Member
Benutzeravatar

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

irgendwo um Zeile 4830 in der glBitmap. Da werden die Daten aus der TBitmap in einen neu allokierten Speicherbereich kopiert. Stichwort Scanline ;)
Code:
  1. function TglBitmap.AssignFromBitmap(const aBitmap: TBitmap): Boolean;
  2. var
  3.   pSource, pData, pTempData: PByte;
  4.   Row, RowSize, TempWidth, TempHeight: Integer;
  5.   IntFormat: TglBitmapFormat;
  6. begin
  7.   result := false;
  8.  
  9.   if (Assigned(aBitmap)) then begin
  10.     case aBitmap.PixelFormat of
  11.       pf8bit:
  12.         IntFormat := tfLuminance8;
  13.       pf15bit:
  14.         IntFormat := tfRGB5A1;
  15.       pf16bit:
  16.         IntFormat := tfR5G6B5;
  17.       pf24bit:
  18.         IntFormat := tfBGR8;
  19.       pf32bit:
  20.         IntFormat := tfBGRA8;
  21.     else
  22.       raise EglBitmap.Create('AssignFromBitmap - Invalid Pixelformat.');
  23.     end;
  24.  
  25.     TempWidth  := aBitmap.Width;
  26.     TempHeight := aBitmap.Height;
  27.     RowSize    := TFormatDescriptor.Get(IntFormat).GetSize(TempWidth, 1);
  28.     GetMem(pData, TempHeight * RowSize);
  29.     try
  30.       pTempData := pData;
  31.       for Row := 0 to TempHeight -1 do begin
  32.         pSource := aBitmap.Scanline[Row];
  33.         if (Assigned(pSource)) then begin
  34.           Move(pSource^, pTempData^, RowSize);
  35.           Inc(pTempData, RowSize);
  36.         end;
  37.       end;
  38.       SetDataPointer(pData, IntFormat, TempWidth, TempHeight); //be careful, Data could be freed by this method
  39.       result := true;
  40.     except
  41.       if Assigned(pData) then
  42.         FreeMem(pData);
  43.       raise;
  44.     end;
  45.   end;
  46. end;


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  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 20 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 : 0.062s | 19 Queries | GZIP : On ]