ImagingOpenGL SIGSEGV / Probleme mit GLScene

Rund um die LCL und andere Komponenten
Antworten
Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

ImagingOpenGL SIGSEGV / Probleme mit GLScene

Beitrag von Thandor »

Hi,

ich Arbeite derzeit das Tutorial für OpenGl (http://wiki.freepascal.org/OpenGL_Tutorial" onclick="window.open(this.href);return false;) durch und bin nun bei den Texturn angelangt, wo mann sich erstmal die "Vampyre Imaging Library" runterladen und "Installieren" muss. Wenn ich jetzt aber das Beispiel-Programm Compiliere und laufen lassen will bringt er mir folgende Fehlermeldung:

"Project textures.exe raised exception class 'External: SIGSEGV'."

Mein betriebssystem ist: Windows 7 Prof. 64 Bit

Wenn ich die beiden Aufruf

Code: Alles auswählen

Tex1 := LoadGLTextureFromFile('ashwood.bmp');
Tex2 := LoadGLTextureFromFile('Flare.bmp');
auskommentiere läuft das Programm, halt nur ohne Texturen, was ja nicht Sinn der Sache ist

hier noch der Quellcode

Code: Alles auswählen

program textures;
 
{$mode objfpc}{$H+}
 
uses
  gl, glu, glut, ImagingOpenGL;
 
const
  AppWidth = 640;
  AppHeight = 480;
  LIST_OBJECT = 1;
 
var
  Tex1, Tex2: GLuint;
 
procedure InitializeGL;
begin
  glClearColor(0, 0, 0, 0);
  Tex1 := LoadGLTextureFromFile('ashwood.bmp');
  Tex2 := LoadGLTextureFromFile('Flare.bmp');
  glEnable(GL_TEXTURE_2D);
end;
 
procedure CreateList;
begin
  glNewList(LIST_OBJECT, GL_COMPILE);
    glBegin(GL_QUADS);
      glTexCoord2f(1, 0);
      glVertex3f( 2, 2, 0);
      glTexCoord2f(0, 0);
      glVertex3f(-2, 2, 0);
      glTexCoord2f(0, 1);
      glVertex3f(-2,-2, 0);
      glTexCoord2f(1, 1);
      glVertex3f( 2,-2, 0);
    glEnd;
  glEndList;
end;
 
procedure DrawGLScene; cdecl;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 
  glLoadIdentity;
  glTranslatef(-5, 0, -15);
  glBindTexture(GL_TEXTURE_2D, Tex1);
  glCallList(LIST_OBJECT);
 
  glLoadIdentity;
  glTranslatef(0, 0, -15);
  glBindTexture(GL_TEXTURE_2D, Tex2);
  glCallList(LIST_OBJECT);
 
  glLoadIdentity;
  glTranslatef(5, 0, -15);
  glBindTexture(GL_TEXTURE_2D, Tex1);
  glCallList(LIST_OBJECT);
 
  glEnable(GL_BLEND);
  glBlendFunc(GL_ZERO, GL_SRC_COLOR);
  glLoadIdentity;
  glTranslatef(5, 0, -15);
  glBindTexture(GL_TEXTURE_2D, Tex2);
  glCallList(LIST_OBJECT);
  glDisable(GL_BLEND);
 
  glutSwapBuffers;
end;
 
procedure ReSizeGLScene(Width, Height: Integer); cdecl;
begin
  if Height = 0 then
    Height := 1;
 
  glViewport(0, 0, Width, Height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45, Width / Height, 0.1, 1000);
 
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
end;
 
procedure GLKeyboard(Key: Byte; X, Y: Longint); cdecl;
begin
  if Key = 27 then
  begin
    glDeleteLists(LIST_OBJECT, 1);
    Halt(0);
  end;
end;
 
procedure glutInitPascal(ParseCmdLine: Boolean);
var
  Cmd: array of PChar;
  CmdCount, I: Integer;
begin
  if ParseCmdLine then
    CmdCount := ParamCount + 1
  else
    CmdCount := 1;
  SetLength(Cmd, CmdCount);
  for I := 0 to CmdCount - 1 do
    Cmd[I] := PChar(ParamStr(I));
  glutInit(@CmdCount, @Cmd);
end;
 
var
  ScreenWidth, ScreenHeight: Integer;
begin
  glutInitPascal(True);
  glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH);
  glutInitWindowSize(AppWidth, AppHeight);
  ScreenWidth := glutGet(GLUT_SCREEN_WIDTH);
  ScreenHeight := glutGet(GLUT_SCREEN_HEIGHT);
  glutInitWindowPosition((ScreenWidth - AppWidth) div 2, (ScreenHeight - AppHeight) div 2);
  glutCreateWindow('OpenGL Tutorial :: Textures');
 
  InitializeGL;
  CreateList;
 
  glutDisplayFunc(@DrawGLScene);
  glutReshapeFunc(@ReSizeGLScene);
  glutKeyboardFunc(@GLKeyboard);
 
  glutMainLoop;
end.
MfG
Thandor
Zuletzt geändert von Thandor am Sa 11. Sep 2010, 07:24, insgesamt 1-mal geändert.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: ImagingOpenGL SIGSEGV

Beitrag von Scotty »

Du hast eine Menge Units eingebunden und lässt auch einiges laufen. Da ist es schwer, eine SIGSEV zu finden. Den Code hast du vermutlich richtig umgesetzt, so dass ich an deiner Stelle nach einer Inkompatibilität der Fpc Version suchen würde.
Ich selbst mag GLUT nicht, da die Bibliothek nicht unbedingt auf dem Zielsystem installiert sein muss. Ich benutze auch ungern "eigenartige", nicht zu FCL/LCL gehörende Units (Vampyre Imaging Library) - aber ich bin ja auch nur ein Amateur :oops: .
Es gibt die Unit LazOpenGLContext, das einige Beispiele mitbringt, und irgendwo habe ich auch Routinen gefunden, mit denen man Bitmaps leicht in Raw Data umwandeln kann. Leider lassen viele Tutorials solche Dinge aus (auch die Initialisierung wird durch glut erschlagen), um sich mit den Kernfragen von OpenGL zu beschäftigen.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
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: ImagingOpenGL SIGSEGV

Beitrag von corpsman »

Das installieren einer ganzen Library wäre mir auch zu wieder. Im 32-Bit Bereich nutze ich für Linux und Windows DGLOpenGL.pas. Ob die unter 64-Bit geht kann ich so natürlich nicht sagen. Das laden von Graphiken mache ich dann mittels der Befehle aus DGLOpenGL und einer eigens dafür geschriebenen Graphikengine.
--
Just try it

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: ImagingOpenGL SIGSEGV

Beitrag von felix96 »

Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: ImagingOpenGL SIGSEGV

Beitrag von Euklid »

Thandor hat geschrieben:"Project textures.exe raised exception class 'External: SIGSEGV'."

Hallo,

es handelt sich um einen Speicherzugriffsfehler: Er greift auf einen nicht zugewiesenen Speicherbereich zu.
Du kannst über die Compilereinstellungen im Reiter "Linken" die heaptrc einspannen. Wenn Du dann dein Programm von der Konsole aus startest, zeigt er Dir spätestens beim Beenden des Programms an, wo und durch welche Aufrufkette bedingt der Zugriffsfehler entstanden ist. Dadurch lässt sich der fehlerbehaftete Codebereich stark einschränken.
Wenn Du Probleme hast, die Konsolenausgaben der heaptrc zu deuten, kannst Du sie auch hier posten.

Viele Grüße, Alexander

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: ImagingOpenGL SIGSEGV

Beitrag von Thandor »

Hi,
felix96 hat geschrieben:Kennst du die Touturials?
http://wiki.delphigl.com/index.php/Tutorial
Ja die kenne ich, leider habe ich diese bisher nur mit Delphi zum Laufen gebracht.
corpsman hat geschrieben:Im 32-Bit Bereich nutze ich für Linux und Windows DGLOpenGL.pas. Ob die unter 64-Bit geht kann ich so natürlich nicht sagen. Das laden von Graphiken mache ich dann mittels der Befehle aus DGLOpenGL und einer eigens dafür geschriebenen Graphikengine.
Also die DGLopenGL läuft bei mir unter 64Bit, naja jedenfalls mit Delphi...
Gibt es eigentlich auch eine Graphikengine auf OpenGl-Basis für Lazarus, die einfach und unkompliziert zu benutzen ist :?:

MfG
Thandor

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: ImagingOpenGL SIGSEGV

Beitrag von Euklid »

Thandor hat geschrieben: Also die DGLopenGL läuft bei mir unter 64Bit, naja jedenfalls mit Delphi...
Gibt es eigentlich auch eine Graphikengine auf OpenGl-Basis für Lazarus, die einfach und unkompliziert zu benutzen ist :?:

ja, die gibt es: GLScene. http://wiki.lazarus.freepascal.org/GLScene/de" onclick="window.open(this.href);return false;

Bzgl. Grafikprogrammierung dürfte Dir auch der carli weiterhelfen können. Er programmiert meines Wissens nach auch an einer 3D-Engine.

Viele Grüße, Euklid

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: ImagingOpenGL SIGSEGV

Beitrag von Thandor »

Hi,

habe mir jetzt GlScene heruntergeladen und die Installationsanweisungen ausgeführt. Doch bei den Schritt
Klicken sie auf den "Speichern und IDE neu bauen" Button
Bekomme ich folgenden Fehler: :evil:

Bild

Wo bekomme ich jetzt das Package "jpegForLazarus" her ?
Meinen Nachforschungen zu Folge war dieses Package in den frühreren Versionen von Lazarus dabei, aber in den neueren verionen sollen die Funktionen aus diesem Package in die VCL übergegangen sein :?:

MfG
Thandor

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: ImagingOpenGL SIGSEGV

Beitrag von Thandor »

Ok habe jetzt auf der englischen Seite etwas gefunden, was funktioniert hat, aber nach dem Installieren von

glscenecgshader

lässt sich Lazarus nicht mehr starten :evil:, weil ich die cg.dll, cggl.dll,.. nicht habe.

Mit ratlosen Grüßen
Thandor

Live
Beiträge: 144
Registriert: So 22. Aug 2010, 16:06
OS, Lazarus, FPC: Backtrack 5 RC4 - 64bit Gnome
CPU-Target: 64bit
Wohnort: NRW
Kontaktdaten:

Re: ImagingOpenGL SIGSEGV

Beitrag von Live »

Manuelles herunterladen der DLLs hilft auch nicht?

CGGL.dll

cg.dll

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: ImagingOpenGL SIGSEGV

Beitrag von Thandor »

Bei der cg.dll geht das, aber bei der cGGL.dll findet er einen Einsprungspunkt nicht

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: ImagingOpenGL SIGSEGV

Beitrag von Euklid »

Thandor:
Unter dieser Überschrift wird niemand eine Frage zu GLScene oder jpegforlazarus vermuten. Um die Wahrscheinlichkeit zu erhöhen, dass jemand der Dir weiter helfen kann, der Deine Frage ließt, ist es nützlich, diese auch in einem Thread mit passender Überschrift zu stellen.

- Euklid

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: ImagingOpenGL SIGSEGV / Probleme mit GLScene

Beitrag von Thandor »

Hi,

ja da hast du wohl recht, das Thema hat sich in eine ungearnte Richtung entwickelt, ich habe die Überschrift nun etwas erweitert...

MfG
Thandor

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: ImagingOpenGL SIGSEGV / Probleme mit GLScene

Beitrag von Scotty »

Ich habe auch längere Zeit mit glscene "rumgemacht". Ich würde es für Anfänger nicht empfehlen.
Um GlScene zu installieren, musst du den Code etwas verändern. Die Abhängigkeit entfernen und irgendwo statt jpg jepg schreiben. Danach bekommst du aber eine IMHO viel kompliziertere Bibliothek als es OpenGL ursprünglich ist. Man kann zwar mit ausreichend Einarbeitungszeit und Ausprobieren einfache Dinge zeichnen, aber wenn es komplizierter wird, muss man sich mit den 100+ Komponenten von GlScene auseinandersetzen.
Ich benutze LazOpenGLContext (als Teil der LCL unter Packages zu finden; ../lazarus/components/opengl). Da werden Beispiele mitgeliefert, die einfach sind und sich trotzdem leicht erweitern lassen. Unter ..lazarus/examples/openglcontrol gibt im Projekt die function LoadglTexImage2DFromBitmapFile(Filename:string); mit der deine Frage zum Laden von Bitmaps beantwortet wird. Die Funktion ist übersichtlich und halbwegs leicht zu verstehen ist. Außerdem gibt es unter ...fpc/packages/opengl noch Zeug, allerdings mit Glut wenn ich mich recht erinnere.

Noch ein paar Links:
http://glscene.sourceforge.net/wikka/HomePage" onclick="window.open(this.href);return false;
http://wiki.delphigl.com/index.php/Hauptseite" onclick="window.open(this.href);return false;
http://www.friends-of-fpc.org/tutorials ... s/dlx_ogl/" onclick="window.open(this.href);return false;

Es gibt eine GlScene-Mailingliste, die im Gegensatz zum GlScene-Forum auch genutzt wird. Fragen zu lazopenglcontext werden natürlich in alle Foren und Mailinglisten beantwortet.

Antworten