AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OpenGL und Firemonkey

Ein Thema von Peter666 · begonnen am 20. Mai 2013 · letzter Beitrag vom 22. Mai 2013
Antwort Antwort
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

OpenGL und Firemonkey

  Alt 20. Mai 2013, 13:41
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.

Geändert von Peter666 (20. Mai 2013 um 13:48 Uhr)
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
267 Beiträge
 
#2

AW: OpenGL und Firemonkey

  Alt 20. Mai 2013, 21:23
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

Geändert von CHackbart (20. Mai 2013 um 21:38 Uhr)
  Mit Zitat antworten Zitat
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#3

AW: OpenGL und Firemonkey

  Alt 22. Mai 2013, 20:12
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?
  Mit Zitat antworten Zitat
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#4

AW: OpenGL und Firemonkey

  Alt 22. Mai 2013, 20:21
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}
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 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