Texturen laden für OpenGl (DGLOpenGl)

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Texturen laden für OpenGl (DGLOpenGl)

Beitrag von t-z »

Hallo,

ich versuche gerade mein erstes OpenGl-Programm zu schreiben. Dieses stellt einen Versuch für eine 2D-Animation dar. Ich hangel mich dabei an diesen beiden Tutorials entlang:
http://wiki.delphigl.com/index.php/Tutorial_Quickstart
http://wiki.delphigl.com/index.php/Tutorial_2D

Das OpenGL Grundgerüst steht nun so weit. Nun habe ich aber das Problem, dass weder die Textures.pas noch die GlBitmap nicht funktionieren.

Bei er Textures.pas hakt es nach einigen Änderungen scheinbar nur noch am InlineAssembler - jedenfalls bekomme ich nur noch diesbezügliche Fehlermeldungen. Da ich aber kein Assembler kann, weiß ich nicht, wie ich diese Umgehen (sprich in Pascal umschreiben) oder Beheben kann. Das Problem liegt wohl in 32-Bit-Anweisungen in einer 64-Bit-Anwendung.

Bei der GlBitmap bekomme ich folgende Fehlermeldung, wenn ich die Unit einbinde:

Code: Alles auswählen

project1.lpr(20,1) Error: Import library not found for c
. Daraus kann ich mir nun gar keinen Reim machen.

Kann mir jemand helfen Texturen einzubinden?

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von marcov »

t-z hat geschrieben:
Bei der GlBitmap bekomme ich folgende Fehlermeldung, wenn ich die Unit einbinde:

Code: Alles auswählen

project1.lpr(20,1) Error: Import library not found for c
. Daraus kann ich mir nun gar keinen Reim machen.
Ich auch nicht. libc ist etwas Unixsches, aber Import Libs sind typisch Windows. Hört sich an das du entweder Versuchst Unix Quellen auf Windows zu kompilieren, oder eine Mischung von FPC mit andere Toolchains (mingw,cygwin, überprüfe ob die in PATH sein)

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von t-z »

Hieraus schließe ich, dass die Unit FPC kompatibel ist:

Code: Alles auswählen

{$ifndef fpc}
  {$OPTIMIZATION ON}
{$endif}
Dies sind die eingebundenen Units:

Code: Alles auswählen

interface
 
uses
  {$ifdef GLB_NO_NATIVE_GL} dglOpenGL,                            {$endif}
 
  {$ifdef GLB_SDL}          SDL,                                  {$endif}
  {$ifdef GLB_DELPHI}       Dialogs, Windows, Graphics,           {$endif}
 
  {$ifdef GLB_SDL_IMAGE}    SDL_image,                            {$endif}
 
  {$ifdef GLB_PNGIMAGE}     pngimage,                             {$endif}
  {$ifdef GLB_LIB_PNG}      libPNG,                               {$endif}
 
  {$ifdef GLB_DELPHI_JPEG}  JPEG,                                 {$endif}
  {$ifdef GLB_LIB_JPEG}     libJPEG,                              {$endif}
  Classes, SysUtils;
 
...
 
implementation
 
uses
  Math;
So direkt kann ich da kein Problem sehen - jedenfalls wird keine Unit als vermisst angezeigt. Der oben genannte Fehler ist der einzige, der angezeigt wird.

Zur Zeit schreibe ich unter Win 7 Pro 64 Bit

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von marcov »

t-z hat geschrieben:
Dies sind die eingebundenen Units:
Einer jener Units referiert libc.
Zur Zeit schreibe ich unter Win 7 Pro 64 Bit
Mit 32-bit oder 64-bit FPC?

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von t-z »

64-Bit FPC/Lazarus

SDL, SDL_image, math: machen keine Probleme
Dialogs, Windows, Graphics, Classes, SysUtils: Eh schon drin
pngimage, libPNG, JPEG (müsste in LazLPG geändert werden - ist abhängig von ImagesForLazarus), libJPEG: gibt es nicht - werden also wohl durch den Präprozessor ausgeblendet

Damit habe ich alle eingebundenen Units durchprobiert - ohne diesen Fehler.

Ansonsten habe ich noch folgende Abhängigkeiten gefunden:

Code: Alles auswählen

{$ifdef LINUX}
  libglu = 'libGLU.so.1';
  libopengl = 'libGL.so.1';
{$else}
  libglu = 'glu32.dll';
  libopengl = 'opengl32.dll';
{$endif}
Beide dlls existieren unter C:\Windows\System32

Alle Funktionen sind statisch gelinkt nach folgendem Muster:

Code: Alles auswählen

function glGetString(name: Cardinal): PAnsiChar; {$ifdef Win32}stdcall; {$else}cdecl; {$endif} external libopengl;
Ich glaube ich habe das Problem gefunden:

Code: Alles auswählen

{$ifndef WIN32}
    {$linklib c}
  {$endif}
Ich habe es nun durch

Code: Alles auswählen

{$if not(defined(Win32) or defined(Win64))}
ersetzt und ich bekomme keine Fehlermeldung mehr. Ich werde aber wohl auch die anderen ifdefs ändern müssen.

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von marcov »

t-z hat geschrieben: Ich glaube ich habe das Problem gefunden:

Code: Alles auswählen

{$ifndef WIN32}
    {$linklib c}
  {$endif}
Ich habe es nun durch

Code: Alles auswählen

{$if not(defined(Win32) or defined(Win64))}
ersetzt und ich bekomme keine Fehlermeldung mehr. Ich werde aber wohl auch die anderen ifdefs ändern müssen.
Bis jener WINCE versucht. {$ifdef Unix} ist logischer.

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von t-z »

Hast Recht. Von der anderen Seite her betrachtet wird das wirklich ganz leicht und einfach. da ich nicht für Mac programmieren möchte (ich hätte auch gar keinen), reicht die Frage nach Linux auch. Danke.

Das Testbild wird inzwischen richtig herum auf die Ebene gezeichnet, die auch die nun auch richtige Größe hat. Jetzt muss ich mir erst mal so Sachen wie Transparenz und so durchlesen.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von corpsman »

Bei Transparenz kannst evtl in meiner Graphik Engine was ab schauen ;)

Und wenns Animationen sein sollen Sprite Engine
--
Just try it

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von t-z »

Das habe ich schon samt Zeitsynchronisation am laufen. Als nächstes werde ich mich an das Problem mit Bildübergängen wie Verpixel machen. Meine Idee dazu ist eine Alpha-Maske auf herkömmlichen Wege zu erstellen und dann auf die obere Ebene zu legen.

Überblenden mache ich so:

Code: Alles auswählen

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
und die Ebenen erhalten einen zuvor berechnenten Alpha-Wert mit

Code: Alles auswählen

glcolor4f(1,1,1,P1);
Bei der unteren Ebene ist das Blenden jeweils deaktiviert:

Code: Alles auswählen

glDisable(GL_BLEND);
Seltsamerweise müssen beide Ebenen einen Alpha-Wert haben, der in der Summe 1 ergibt. Ansonsten bekomme ich ein ich sag mal überbelichtetes Bild heraus.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von corpsman »

das müste an

Code: Alles auswählen

glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
liegen, probiere mal

Code: Alles auswählen

glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
oder eine der anderen Kombinationen..
--
Just try it

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von carli »

corpsman hat geschrieben:

Code: Alles auswählen

glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);

Code: Alles auswählen

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
falls die Transparenz genau anders herum ist.

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von t-z »

Code: Alles auswählen

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
ist in meinem Fall richtig.
Nun bin ich dabei das ganze in eine Komponente zu packen. Dabei habe ich aber gleich zu Anfang ein Problem: Hier wird ein unbekannter Fehler angezeigt

Code: Alles auswählen

DC:= GetDC(self.Handle);
(befindet sich im Constructor). Die Komponente erbt von TCustomControl.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von carli »

Für den DC musst du das Windows-Handle vom Fenster angeben. (tform.handle)

Wäre cool, wenn du mal eine einheitliche plattformunabhängige OpenGL-Komponente bauen würdest ;)

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von t-z »

Es funktioniert auch mit nem Panel. Dieses erbt von TCustomPanel und dieses wiederum von TCustomControl (Zur Info: TPanel published nur die Eigenschaften). Eigentlich arbeite ich immer mit TCustomControl, da dieses eine Canvas bietet und sehr viele Events schon vordefiniert hat (ist in diesem Fall irrelevant).

Das Problem war folgendes: Die OpenGl-Initialisierung war wie gesagt im Constructor. Dort ist der Komponente aber noch kein Parent zugewiesen. Ich habe die Initialisierung erst einmal in eine Prozedur verlegt, die erst nach der Zuweisung des Parents manuell aufgerufen wird.

Mein Ziel ist es nicht OpenGl zu vereinfachen, sondern OpenGl für Überblendeffekte z.B. zwischen Bildern zu nutzen. Es wäre aber ohne weiteres auch möglich andere Inhalte zu überblenden. Ob die Komponente dann zur Designzeit benutzt werden könnte steht auch noch in den Sternen. Erst einmal muss ich sie zur Laufzeit ans laufen bringen, dann kümmere ich mich um die Kompatibilität zu Linux und dann kommt der Rest.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Texturen laden für OpenGl (DGLOpenGl)

Beitrag von carli »

t-z hat geschrieben:Das Problem war folgendes: Die OpenGl-Initialisierung war wie gesagt im Constructor. Dort ist der Komponente aber noch kein Parent zugewiesen.
Auch nicht, wenn inherited zuerst aufgerufen wird?

Antworten