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

Aktuelle Zeit: Di Mär 19, 2024 12:30

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Mär 27, 2018 17:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1272
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Mit folgender Funktion speichere ich meine Scene ab. Dies funktioniert wunderbar, wen die Scene nicht auf dem Kopf stehen würde.
Die Ursache ist mir bekannt. Bei einer Bitmap ist der Nullpunkt links-oben, bei OpenGL links/unten.
Code:
  1. procedure TForm1.ButtonScreenSaveClick(Sender: TObject);
  2. var
  3.   Picture: TPicture;
  4. begin
  5.   Picture := TPicture.Create;
  6.   with Picture do begin
  7.     Bitmap.PixelFormat := pf32bit;
  8.     Bitmap.Width := ClientWidth;
  9.     Bitmap.Height := ClientHeight;
  10.     glBindFramebuffer(GL_FRAMEBUFFER, 0);
  11.     glReadPixels(0, 0, ClientWidth, ClientHeight, GL_RGBA, GL_UNSIGNED_BYTE, Bitmap.RawImage.Data);
  12.  
  13.     SaveToFile('screen.png');
  14.   end;
  15.   Picture.Free;
  16. end;  

Gibt es dafür eine einfache Funktion, oder muss ich das Bild manuell Zeile für Zeile umkopieren ?
Evtl. wäre es möglich mit glReadPixels Zeile für Zeile auszulesen und in die RawImage zu schreiben.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 27, 2018 19:08 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Kannst ja die Projektionsmatrix veraendern, sodass das bild gespiegelt wird.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 27, 2018 20:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1272
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Kannst ja die Projektionsmatrix veraendern, sodass das bild gespiegelt wird.

Dann ist das Bild auf dem Screen auch verkehrt, eigentlich will ich an den Matrizen nichts verändern.

Ich habe es jetzt so gelöst, das ich Zeile für Zeile einlese und in die Bitmap schreibe.
So muss ich wenigstens nichts umkopieren.

Code:
  1. procedure TForm1.ButtonScreenSaveClick(Sender: TObject);
  2. var
  3.   Picture: TPicture;
  4.   i: integer;
  5. begin
  6.   Picture := TPicture.Create;
  7.   with Picture.Bitmap do begin
  8.     PixelFormat := pf32bit;
  9.     Width := ogc.Width;
  10.     Height := ogc.Height;
  11.     glBindFramebuffer(GL_FRAMEBUFFER, 0);
  12.  
  13.     for i := 0 to Height - 1 do begin
  14.       glReadPixels(0, Height - i - 1, Width, Height - i, GL_RGBA, GL_UNSIGNED_BYTE, ScanLine[i]);
  15.     end;
  16.  
  17.     SaveToFile('screen.png');
  18.   end;
  19.   Picture.Free;
  20. end;

_________________
OpenGL


Zuletzt geändert von mathias am Di Mai 29, 2018 20:11, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 28, 2018 00:01 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Zitat:
Dann ist das Bild auf dem Screen auch verkehrt, eigentlich will ich an den Matrizen nichts verändern.


Nein? Du darfst halt nicht direkt flushen, sondern musst die Matrix vorher restoren...

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 28, 2018 16:29 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1272
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Dies ist viel zu aufwändig.
Gut, ich könnte die Projectionsmatrix sichern und drehen, anschliessend DrawScene ausführen, Bild speichern, die Matrix gesicherte wieder laden.
SwapBuffers muss man auch noch beachten, ansonsten sieht man die Drehung kurz auf dem Screen.

Mit diesem Ablauf ist die Gefahr gross, das man einen Fehler einbaut, somit bleibe ich lieber beim Zeilen auslesen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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