Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Framebuffer in eine BitMap unter openGL (https://www.delphipraxis.net/193055-framebuffer-eine-bitmap-unter-opengl.html)

KlausJakob 15. Jun 2017 10:53

Framebuffer in eine BitMap unter openGL
 
Guten Tag,
ich möchte unter Delphi/ openGL den Framebuffer (Grafik auf dem Screen) direkt in eine BitMap schaufeln - nicht über den Umweg zur Festplatte.
Den nachfolgenden -modifizierten- Code habe ich aus dem Internet - Dank an den Verfasser.
Leider zeigt die Routine glReadPixel beim Programmlauf eine "Zugriffsverletzung" an.

Frage an die Community:
Wie muss der nachfolgende Code korrigiert werden ?

Vielen Dank
KlausJakob

////////////////////////////////////////////////////

procedure screentobitmap(var name:TBitMap);
var
pixels:Array of Byte;
viewport:Array [0 .. 3] of Integer;
mstream:TMemoryStream;
begin
mstream:=TMemoryStream.Create;

name.PixelFormat:=pf32bit;
glGetIntegerv(GL_VIEWPORT,@viewport);
name.Width:=viewport[2];
name.Height:=viewport[3];

try
SetLength(pixels,viewport[2]*viewport[3]*4);
glReadPixels(0,0,viewport[2],viewport[3],GL_BGRA,GL_UNSIGNED_BYTE,@pixels);
// glReadPixels erzeugt "Zugriffsverletzung" ???????????
mstream.Read(pixels,viewport[2]*viewport[3]*4);
name.LoadFromStream(mstream);
finally
mstream.Free;
end;
end;

//////////////////////////////////////////////////////////////////////////

Rollo62 15. Jun 2017 13:47

AW: Framebuffer in eine BitMap unter openGL
 
Meinst du sowas ?

Fritzew 15. Jun 2017 15:41

AW: Framebuffer in eine BitMap unter openGL
 
Das sollte gehen:

Delphi-Quellcode:
glReadPixels(0,0,viewport[2],viewport[3],GL_BGRA,GL_UNSIGNED_BYTE,@pixels[0]);

Versuche mal folgendes:

Delphi-Quellcode:
procedure TForm31.Button1Click(Sender: TObject);
var pixels : array of byte;
begin
  SetLength(pixels, 100);
  showmessage(format('Adress of a pixels %p Adress of pixels[0] : %p', [@pixels, @pixels[0]]));
end;
Die Adresse von Pixels ist nicht dieselbe wie von Pixels[0]! Kann ja nicht sein da auch eine dynamisches Array der Länge 0 existieren kann,

KlausJakob 15. Jun 2017 18:25

AW: Framebuffer in eine BitMap unter openGL
 
Hallo Rollo62,
vielen Dank.
Dein Vorschlag beinhaltet alles was mir fehlte.
Nach tagelangen Versuchen und Suchen einfach Rollo62 fragen!!!! :lol:
Vielen Dank und Grüße aus Speyer
KlausJakob


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz