Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 14, 2024 05:42

Foren-Übersicht » DGL » Feedback
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Okt 18, 2009 08:33 
Offline
DGL Member

Registriert: Sa Okt 17, 2009 12:40
Beiträge: 14
Wohnort: Tirol
Hi, zuerst mal ein großes Lob! Die ersten 3 Tutorials, sind super geschrieben und einfach nachzuvollziehen(für mich)

Jetzt hänge ich aber bei Tutorial (Lektion ) 4. Die SDL Probleme konnte ich durch die Forensuche lösen. Jetzt hänge ich aber an folgendem:

Zitat:
Tapeten besorgen

Ich werde jetzt nicht näher darauf eingehen, wie man Texturen erstellt. Vielleicht gibt's ja einige Photoshopexperten unter Euch, die Lust haben einige Ihrer Tricks den anderen in Form eines Tutorials zu zeigen.

Zunächst einmal müssen wir uns die eigentlichen Bilddaten besorgen. Wir werden das jetzt in diesem Tutorial mit SDL machen es gibt jedoch auch die Möglichkeit die Daten manuell zu laden das könnt Ihr hier nachlesen:

* TGA Bilder laden

Es gibt allerdings auch Texturloader die Euch die nächsten Kapitel abnehmen und das alles für Euch machen. glBitmap ist so ein Loader. Mehr dazu erfahrt Ihr in dem glBitmap-Artikel.

Bei SDL rufen wir nur IMG_Load auf und prüfen dann ob das Laden erfolgreich war. Hierbei sei erwähnt, dass es unter Linux zu Problemen führen kann, wenn ein Programm nicht aus einer Konsole heraus gestartet wurde. In diesem Fall sind die Pfade zu den Texturen nämlich falsch gesetzt und das Laden würde fehlschlagen. Abhilfe schafft man durch das Verwenden von absoluten Pfaden.

uses SDL, SDL_Image;

Code:
  1. var
  2.   tex : PSDL_Surface;
  3. begin
  4.   tex := IMG_Load(PChar(ExtractFileDir(paramStr(0))+'/wiki.jpg'));
  5.   if assigned(tex) then
  6.   begin


Das war es dann auch schon... Wir haben die Textur im Speicher. Doch was nun?


Nummer eins:
Wo gehört der Codeabschnitt hin?
Render
idle
create
???

Ich habs erstmal so, so gehts aber leider nicht.(Showmessage wird nicht aufgerufen.)
Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. var
  3.   tex : PSDL_Surface;
  4. begin
  5.   DC:= GetDC(Handle);
  6.   if not InitOpenGL then Application.Terminate;
  7.  
  8.     tex := IMG_Load(PWideChar(PChar(AnsiString(ExtractFilePath(ParamStr(0))+'test.jpg'))));
  9.     if assigned(tex) then
  10.       Showmessage('Textur geladen.');
  11.   RC:= CreateRenderingContext( DC,
  12.                                [opDoubleBuffered],
  13.                                32,
  14.                                24,
  15.                                0,0,0,
  16.                                0);
  17.   ActivateRenderingContext(DC, RC);
  18.   SetupGL;
  19.   //Init; //Was man sonst so initialisieren will.
  20.   Application.OnIdle := IdleHandler;
  21. end;


Kann mir da einer helfen?
Danke schonmal
mfG
VdG

EDIT: Jetzt wo ich es in form eines Beitrages sehe, sehe ich meinen Fehler... test.jpg heißt eigentlich wiki.jpg.
Jetzt findet er die Grafik...

Sorry dafür :oops: :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 18, 2009 08:46 
Offline
DGL Member

Registriert: Sa Okt 17, 2009 12:40
Beiträge: 14
Wohnort: Tirol
Und schon hab ich ein neues Problem:
Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. var
  3.   tex : PSDL_Surface;
  4. begin
  5.   DC:= GetDC(Handle);
  6.   if not InitOpenGL then Application.Terminate;
  7.  
  8.   tex := IMG_Load(PWideChar(PChar(AnsiString(ExtractFilePath(ParamStr(0))+'wiki.jpg'))));
  9.   if assigned(tex) then
  10.   begin
  11.     glGenTextures(1, @TexID);
  12.     glBindTexture(GL_TEXTURE_2D, TexID);
  13.  
  14.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  15.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  16.  
  17.     // Achtung! Einige Bildformate erwarten statt GL_RGB, GL_BGR. Diese Konstante fehlt in den Standard-Headern
  18.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  19.  
  20.     SDL_FreeSurface(tex);
  21.   end;
  22.  
  23.   RC:= CreateRenderingContext( DC,
  24.                                [opDoubleBuffered],
  25.                                32,
  26.                                24,
  27.                                0,0,0,
  28.                                0);
  29.   ActivateRenderingContext(DC, RC);
  30.   SetupGL;
  31.   //Init; //Was man sonst so initialisieren will.
  32.   Application.OnIdle := IdleHandler;
  33. end;


bei diesem Formcreate nach dem Tutorial erhalte ich bei programmstart : Erste Gelegenheit für Exception bei $75C2FBAE. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000'. Prozess OpenGL.exe (1376)
Das sagt mir der Debugger


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 18, 2009 10:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du nutzt beim Laden der Textur bereits OpenGL obwohl es noch nicht initialisiert ist. Ich würde das Laden der Textur in die Init-Methode packen, jedenfalls nach dem RenderingContext/SetupGL;

P.S. Willkommen im Forum :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 18, 2009 13:00 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Es ist generell davon abzuraten, OGL-spezifische Initalisierungen in Construktoren und OGL-spezifische Freigaben in Destruktoren abzuarbeiten.
Wie Coolcat angemerkt hat, kann es vorkommen, dass beim Construktor der OGL Kontext nihct bereitsteht. Beim Destruktor hingegen kann es vorkommen, dass der Kontext schon vernichtet wurde. Deswegen sind Init- und Dispose- (o.Ä.) Methoden die bessere Alternative.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 18, 2009 14:05 
Offline
DGL Member

Registriert: Sa Okt 17, 2009 12:40
Beiträge: 14
Wohnort: Tirol
Vielen Dank euch beiden. Das klappt.

Allerdings habe ich beim Tut5 schon wieder ein Problem(Schande über mich :( )
Nämlich Displaylists:
Code:
  1. procedure TForm1.Render;
  2. begin
  3.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  4.  
  5.   glMatrixMode(GL_PROJECTION);
  6.   glLoadIdentity;
  7.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  8.  
  9.   glMatrixMode(GL_MODELVIEW);
  10.  
  11.   glLoadIdentity();
  12.  
  13.   glCallList(displaylist);
  14.  
  15.   SwapBuffers(DC);
  16. end;
  17.  
  18. procedure TForm1.Init;
  19. begin
  20.   Displaylist := glGenLists(1);
  21.   glNewList(DisplayList,GL_COMPILE);
  22.     glBegin(GL_LINE);
  23.       glColor3f(1,0,0);
  24.       glVertex3f(0,0,0);
  25.       glColor3f(0,1,0);
  26.       glVertex3f(1,0,0);
  27.     glEnd;
  28.   glEndList;
  29. end;


Das mit der Line sollte nur mal ein Test sein. Allerdings wird nichts gezeichnet(auch kein QUADS oder TRIANGLE)

Wo hab ich da schon wieder so einen Dummen fehler drin?

Danke mfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 18, 2009 14:12 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Um auszuschließen, dass der Fehler an den DL liegt, solltest du zu aller erst mal versuchen den Coder innerhalb der DL direkt an der Stelle einzufügen wo du später die DL aufrufst.

Falls du dann dort auch nichts siehst, könnte es z.B. daran liegen, dass deine Szene zu nah an der "Kamera" also der Near-Clipping-Plane ist.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 18, 2009 14:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das ist mit hoher Wahrscheinlichkeit die Near-Clipping-Plane, versuch mal ein glTranslatef(0, 0, -5) nach dem letzten glLoadIdentity (oder wars +5 anstatt -5? Probier +5, wenn -5 nicht geht).

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 18, 2009 15:52 
Offline
DGL Member

Registriert: Sa Okt 17, 2009 12:40
Beiträge: 14
Wohnort: Tirol
Danke, ihr hattet natürlich recht. Ich hatte es zu nah -> ich hatte translate vergessen...

mfG


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » DGL » Feedback


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.040s | 19 Queries | GZIP : On ]