Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   OpenGL und Firemonkey (https://www.delphipraxis.net/174940-opengl-und-firemonkey.html)

Peter666 20. Mai 2013 12:41

OpenGL und Firemonkey
 
Hallo,

ich habe ein Problem mit OpenGL.
Als Basis für meine Demoanwendung habe ich folgenden Code genommen:
http://escargot.la.coocan.jp/SimpleS...OpenGL_FMX.pas

Das geht soweit unter OSX, als auch Windows ohne probleme. Nun wollte ich anstelle der Farbe eine Textur verwenden.
Im Prinzip macht man da ja so etwas:

Delphi-Quellcode:
 

var
 id: GLUint;
 width, height: integer; //größe der Textur
 pData: pointer; //Zeiger auf die Textur width*height*4 (für rgb)

...

 glGenTextures(1, @id);
 glBindTexture(GL_TEXTURE_2D, id);

 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData);
Leider kennt die OpenGL Übersetzung von Embarcadero glGenTextures und glBindTexture nicht, bzw. unter OSX wird gluBuild2DMipmaps nicht erkannt.

procedure glGenTextures(n: GLsizei; textures: PGLuint);
{$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF UNIX} cdecl;
{$ENDIF} external opengl32;
procedure glBindTexture(target: GLEnum; Texture: GLuint);
{$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF UNIX} cdecl;
{$ENDIF} external opengl32;

Da die Funktionen fehlen habe ich oben stehende Notlösung eingebaut. Hat jemand eine Idee warum das nicht geht? Textures ist 0 und das bedeutet es gibt irgendwo ein Fehler :(

Peter
PS: OpenGL ist natürlich zu dem Zeipunkt wo ich die Textur erstellen will schon initialisiert.

CHackbart 20. Mai 2013 20:23

AW: OpenGL und Firemonkey
 
Kurze Antwort: Die Demo hat nen Denkfehler. Die Activate-Funktion sollte nur einmal nach dem Öffnen des Forms gestartet werden, denn damit erstellt man den Context. Deactivate sollte nur beim Beenden ausgeführt werden und das Laden der Texturen kann erst nach dem Erstellen des Contextes erfolgen. In dem Demo wird der bei jedem Zeichnen neu erstellt, das geht logischerweise nicht. Ansonsten cooler Code :-D

Peter666 22. Mai 2013 19:12

AW: OpenGL und Firemonkey
 
Vielen Dank, das war tatsächlich der Grund. In dem Beispiel wurde der Context vor jedem Rendern initialisiert und danach wieder zurückgesetzt. Ich denke mal das lag daran, dass unter OSX der Context erst erstellt werden kann, wenn das Formular/Fenster fertig ist. Im Prinzip kann man das umgehen indem man einen Timer setzt der den Context erstellt, danach erst die Texturen lädt und tunlichst ein Deaktivieren des Contextes vermeidet.

Nun hab ich jedoch eine weitere Frage. Mit OpenGL habe ich das letzte mal Ende der 90er gespielt und laut OpenGL Definition ist gl_quads veraltet. Mein Code zum Rendern einer Szene schaut wie folgt aus:

Delphi-Quellcode:
glBegin(GL_QUADS);
 glTexCoord2f(tr.Left, tr.Top); glVertex2F(vr.Left, vr.Top);
 glTexCoord2f(tr.Left, tr.Bottom); glVertex2F(vr.Left, vr.Bottom);
 glTexCoord2f(tr.Right, tr.Bottom); glVertex2F(vr.Right, vr.Bottom);
 glTexCoord2f(tr.Right, tr.Top); glVertex2F(vr.Right, vr.Top);
glEnd();
Wie müsste ich das Ändern, damit GL_TRIANGLES anstelle verwendet wird?

Peter666 22. Mai 2013 19:21

AW: OpenGL und Firemonkey
 
Okay manchmal ist man wirklich dämlich, ich beantworte mir das mal selber

Delphi-Quellcode:
{$IFDEF USEQUADS}
  glBegin(GL_QUADS);
  glTexCoord2f(tr.Left, tr.Top);
  glVertex2F(vr.Left, vr.Top);
  glTexCoord2f(tr.Left, tr.Bottom);
  glVertex2F(vr.Left, vr.Bottom);
  glTexCoord2f(tr.Right, tr.Bottom);
  glVertex2F(vr.Right, vr.Bottom);
  glTexCoord2f(tr.Right, tr.Top);
  glVertex2F(vr.Right, vr.Top);
  glEnd();
{$ELSE}
  glBegin(GL_TRIANGLES);
  glTexCoord2f(tr.Left, tr.Top);
  glVertex2F(vr.Left, vr.Top);
  glTexCoord2f(tr.Left, tr.Bottom);
  glVertex2F(vr.Left, vr.Bottom);
  glTexCoord2f(tr.Right, tr.Top);
  glVertex2F(vr.Right, vr.Top);

  glTexCoord2f(tr.Left, tr.Bottom);
  glVertex2F(vr.Left, vr.Bottom);
  glTexCoord2f(tr.Right, tr.Bottom);
  glVertex2F(vr.Right, vr.Bottom);
  glTexCoord2f(tr.Right, tr.Top);
  glVertex2F(vr.Right, vr.Top);
  glEnd();
{$ENDIF}


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 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