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:
Leider kennt die OpenGL Übersetzung von Embarcadero glGenTextures und glBindTexture nicht, bzw. unter OSX wird gluBuild2DMipmaps nicht erkannt.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); 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. |
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
|
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:
Wie müsste ich das Ändern, damit GL_TRIANGLES anstelle verwendet wird?
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(); |
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