Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
Hallo,
gibt es eine Möglichkeit einen Screenshot der 3D Szene in die Zwischenablage oder in bmp zu rendern die annähernd so schnell ist wie das normale Rendern?
Hintergrund: ich möchte zum Anfang gerne bis zu 400 "Bilder" schiessen um diese weiterzuverwenden... bei einer Bildgröße von ca. 1620x1080 braucht diese Procedur dafür 1,3 Sekunden bei mir.
glGetIntegerv(GL_VIEWPORT,@VP);// Viewport in VP ablegen
glPixelStoref(GL_PACK_ALIGNMENT,1);// [*2] keine Ahnung
setLength(pixels,VP[2]*VP[3]*3);// Die Anzahl der notwendingen Bytes im array of
// Pixels beträgt Breite mal Höhe mal 3
glReadPixels(0,0,VP[2],VP[3],// Die Bytes auslesen und in Pixel schreiben
GL_RGB,GL_UNSIGNED_BYTE,@pixels[0]);
bmp.Width:= VP[2];// Dem BMP die Viewport Breite beibringen
bmp.Height:= VP[3];// Dem BMP die Viewport Höhe beibringen
n :=0;// Zähler für die Pixel auf 0 setzen
for y := VP[3]-1downto0do// [*2] für die Anzahl der Zeilen
for x :=0to VP[2]-1do// für die Anzahl der Pixel in der Breite
begin
bmp.Canvas.Pixels[x,y]:=// Die Pixel ins Canvas des BMP malen
RGB(pixels[n],pixels[n+1],pixels[n+2]);// und zwar immer Rot, Grün und Blauwert aus dem array Pixel
inc(n,3);// den zähler um 3 erhöhen
end;
result:=bmp;// Das bmp als result zurückliefern
Screen.Cursor:= crDefault;// den normalen Mauszeiger wieder einschalten
end;
das wären dann bei 400 Bildern über 8 Minuten Wartezeit und das will ich keinem zumuten.. die selbe Szene rendert in 0.007 Sekunden also 185 mal schneller... Hat jemand eine alternative function oder wenigstens einen Tipp wie es noch geht?
[EDIT]: Die Szene muß dafür nicht unbedingt dargestellt werden, wenn das auch ohne geht, wäre es mir sogar noch lieber.. [/EDIT] Danke schonmal und allen schöne Pfingsten!
Registriert: So Aug 08, 2010 08:37 Beiträge: 460
Programmiersprache: C / C++ / Lua
Dass es so langsam ist, liegt hauptsächlich an TBitmap und den anderen verwendeten Windows-Sachen.
Es wäre wesentlich besser, einfach 400 Framebufferobjekte anzulegen, in die du dann direkt renderst. Diese dann aber wieder in Bitmaps umzuwandeln braucht aber wieder einiges an Zeit, aber wenn das Programm danach weiterläuft könntest du dann für das Konvertieren/Speichern einen neuen Thread anlegen, der das dann abarbeitet.
Damit wären glaub ich alle deine Wünsche erfüllt, oder?
_________________ offizieller DGL Compliance Beauftragter Never run a changing system! (oder so)
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
end: sieht man davon ab, dass 400 FBOs bei Full-HD so ca. 3.3 Gigabyte Speicher (hier vermutlich GRAM) verbrauchen.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Also die meiste Zeit beim Screenshot speichern kostet die Kompression. Ich rate dir das was du mit glReadPixels bekommst direkt ohne jede weitere Verarbeitung auf Platte zu schreiben. Idealerweise ist die "Platte" hier natürlich ein RAM-Drive oder eine SSD. Später wenn die Aufnahme komplett ist gehst du nochmal drüber und speicherst in einem platzsparenderen Format mit dem du was anfangen kannst, z.B. PNG, JPG, etc. oder du machst direkt ein Video draus.
Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
erstmal danke für die Antworten, besonders Sascha, ich versuche gerade deinen code bei mir einzupassen, aber ich bekomme eine Zugriffsverletzung in der Zeile:
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.