Luxophia
1unit LUX.GPU.OpenGL.Render;
2
3interface
4
5uses
6System.UITypes,
7FMX.Graphics,
8Winapi.Windows,
9Winapi.OpenGL,
10Winapi.OpenGLext,
11LUX.GPU.OpenGL.Render_;
12
13type
14TGLRender = class(TGL_Render)
15private
16protected
17public
18procedure CopyTo(const BMP_: FMX.Graphics.TBitmap);
19function MakeScreenShot: FMX.Graphics.TBitmap;
20procedure SaveToFile(const FileName_: String);
21end;
22
23implementation
24
25procedure TGLRender.CopyTo(const BMP_: FMX.Graphics.TBitmap);
26var
27Cs: TArray<TAlphaColor>;
28C, B: PAlphaColor;
29Bs: TBitmapData;
30S, Y: Integer;
31begin
32with BMP_ do
33begin
34SetSize(_SizeX, _SizeY);
35SetLength(Cs, _SizeY * _SizeX);
36C := @Cs[0];
37_Frame1.Bind;
38glReadBuffer(GL_COLOR_ATTACHMENT0);
39glReadPixels(0, 0, _SizeX, _SizeY, GL_BGRA, GL_UNSIGNED_BYTE, C);
40
41_Frame1.Unbind;
42
43Map(TMapAccess.Write, Bs);
44S := SizeOf(TAlphaColor) * _SizeX;
45for Y := _SizeY - 1 downto 0 do
46begin
47B := Bs.GetScanline(Y);
48System.Move(C^, B^, S);
49Inc(C, _SizeX);
50end;
51Unmap(Bs);
52end;
53end;
54
55function TGLRender.MakeScreenShot: FMX.Graphics.TBitmap;
56begin
57Result := FMX.Graphics.TBitmap.Create;
58CopyTo(Result);
59end;
60
61procedure TGLRender.SaveToFile(const FileName_: String);
62begin
63with MakeScreenShot do
64begin
65SaveToFile(FileName_);
66Free;
67end;
68end;
69
70
71initialization
72
73finalization
74
75end.
76