![]() |
OpenGL Panel in Firemonkey
Hi,
hat jemand eine Idee wie ich ein OpenGL Panel in einem Firemonkey Formular erstellen kann? Unter VCL reicht es ein TPanel Wincontrol zu erstellen und das Handle von da zu nehmen. Das geht ja unter FMX nicht und ich bräuchte das für Android, Mac und Windows. Peter |
AW: OpenGL Panel in Firemonkey
Schau Dir mal die Beispiele hier an. Beim Demo TestBed Es wird per OpenGL(ES) auf dem Canvas eines Panels gezeichnet.
![]() |
AW: OpenGL Panel in Firemonkey
Sorry dass ich mich jetzt erst melde. Also unter Windows und Mac hab ich das recht leicht hinbekommen:
Code:
bzw.
FillChar(WindowClass, SizeOf(WindowClass), 0);
WindowClass.Style := CS_HREDRAW or CS_VREDRAW; WindowClass.lpfnWndProc := @DefWindowProc; WindowClass.cbClsExtra := 0; WindowClass.cbWndExtra := 0; WindowClass.hInstance := hInstance; WindowClass.hCursor := LoadCursorW(0, PChar(IDC_ARROW)); WindowClass.hbrBackground := GetStockObject(NULL_BRUSH); WindowClass.lpszMenuName := nil; WindowClass.lpszClassName := PChar('OpenGLWindow'); if Winapi.Windows.RegisterClass(WindowClass) = 0 then RaiseLastOSError; end; FWnd := CreateWindowEx(0, WindowClass.lpszClassName, nil, WS_CHILDWINDOW, 0, 0, 0, 0, GetDesktopWindow, 0, hInstance, nil); ShowWindow(FWnd, SW_HIDE);
Code:
Verändert man die Größe der Komponente passe ich einfach das Subview an bzw. das Fenster. Ich glaube das macht der Mediaplayer in Firemonkey auch so.
FView := TNSView.Create;
FView := TNSView.Wrap(FView.initWithFrame(MakeNSRect(0, 0, 0, 0))); FView.setHidden(true); Woran ich scheitere ist das selbe unter GLES zu machen. Theoretisch sollte ich doch durch einfaches Zeichnen mit GLES Kommandos unter Android und iOS ja auch etwas rendern können, oder? Mein Code zum zeichnen schaut so aus:
Code:
Peter
procedure TForm1.DoRenderScene;
const vcolors: array [0 .. 11] of Single = (0.0, 1.0, 0.0, 0.5, 1.0, 0.0, 0.0, 0.5, 0.0, 0.0, 1.0, 0.5); var x, y: Single; i: integer; q3: array [0 .. 3] of record x, y, z: Single; end; begin FAngle := FAngle + 1; {$IFDEF CPUARM} glEnableClientState(GL_VERTEX_ARRAY); for i := 0 to 2 do begin q3[i].x := cos((FAngle + 120 * i) * PI / 180); q3[i].y := sin((FAngle + 120 * i) * PI / 180); q3[i].z := 0; end; glVertexPointer(3, GL_FLOAT, 0, @q3[0]); glTexCoordPointer(4, GL_FLOAT, 0, @vcolors[0]); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); {$ELSE} glBegin(GL_TRIANGLES); for i := 0 to 2 do begin x := cos((FAngle + 120 * i) * PI / 180); y := sin((FAngle + 120 * i) * PI / 180); glVertex2F(x, y); glColor4F(vcolors[i * 4 + 0], vcolors[i * 4 + 1], vcolors[i * 4 + 2], vcolors[i * 4 + 3]); end; glEnd(); {$ENDIF} glFlush(); // --------------------------------------------------------------------------- end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz