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

Aktuelle Zeit: Fr Jul 18, 2025 15:54

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: C++: Problem
BeitragVerfasst: Mi Mär 22, 2006 17:47 
Offline
DGL Member

Registriert: Mi Mär 22, 2006 17:39
Beiträge: 7
Mahlzeit!

Ich programmiere C++ und Perl an der Arbeit, und will privat jetzt mal nen bisschen mit Grafikprogrammierung rumbasteln. Hoffe ihr helft mir, obwohl mein Code nicht Delphi ist.

Zum Einstieg hab ich mal was gebastelt, was mir den Bildschirm in Quadrate einteilt. Villeicht mach ich mal sowas wie Schiffe versenken draus oder so, aber ich scheitere hier schon am Anfang. Folgendes Problem:

Ich habe eine 2D-Welt erstellt, mit

glOrtho(0, this->screen->w, 0, this->screen->h, -1.0f, 1.0f);

screen, ist dabei ein SDL_Surface*. Also so wie in dem SDL-Tut von wiki.delphigl.com.
Die Einteilung des Bildschirms in 32x32px Quadrate funzt auch. Jetzt wollt ich mal ne Textur auf die Einzelnen Quadrate kleben, allerding bleibt jetzt mein Fenster weiß. Zum Laden des Bildes benutze ich den Targa-Loader von der NeHe Seite, Lektion 33. So sieht mein Code aus (die wichtigen Stellen):

die header datei mit den Weltklassen

Code:
  1.  
  2. #ifndef _WORLD_H_
  3. #define _WORLD_H_
  4. #include <stdlib.h>
  5.  
  6. #include "constants.h"
  7.  
  8.  
  9. class Area
  10. {
  11.  
  12. private:
  13.     int ID;
  14.     Pos pos;
  15.     int size;
  16.     int type;
  17.     Texture tex;
  18.  
  19. public:
  20.     Area();
  21.     ~Area();
  22.     void Setup(Pos position, int Type);
  23.    
  24.     void setID(int id){this->ID = id;}
  25.     int getID(){return this->ID;}
  26.     void setSize(int Size){this->size = Size;}
  27.  
  28.     void Draw();
  29. };
  30.  
  31. class World
  32. {
  33. private:
  34.     Area **matrix;
  35.     int fieldsize;
  36.     int fieldsX;
  37.     int fieldsY;
  38. public:
  39.     World(int FieldSize, int solX, int solY);
  40.     ~World();
  41.  
  42.     Area **Matrix(){return this->matrix;}
  43.  
  44.     void Draw();
  45. };
  46.  
  47. #endif
  48.  



und die Implementationen dazu:

Code:
  1.  
  2. #include "World.h"
  3.  
  4.  
  5. World::World(int Fieldsize, int solX, int solY)
  6. {
  7.     int idgiver = 0;
  8.     this->fieldsize = Fieldsize;
  9.     this->fieldsX = solX / Fieldsize;
  10.     this->fieldsY = solY / Fieldsize;  
  11.     Pos tmpos;
  12.  
  13.     this->matrix = (Area**) malloc(this->fieldsX*sizeof(Area*));
  14.     tmpos.X = 0;
  15.     tmpos.Y = 0;
  16.     for(int i = 0; i < this->fieldsX; i++)
  17.     {
  18.         tmpos.Y = 0;
  19.         this->matrix[i] = (Area*) malloc(this->fieldsY*sizeof(Area));
  20.         for(int j = 0; j < this->fieldsY; j++)
  21.         {
  22.             this->matrix[i][j].setID(idgiver);
  23.             idgiver++;
  24.             this->matrix[i][j].setSize(Fieldsize);
  25.             this->matrix[i][j].Setup(tmpos, GRASLAND);
  26.             tmpos.Y += this->fieldsize;
  27.         }
  28.         tmpos.X += this->fieldsize;
  29.        
  30.     }
  31. }
  32.  
  33. World::~World()
  34. {
  35.     free(matrix);
  36. }
  37.  
  38. /*void World::CreateLevelData()
  39. {
  40.     for(int i = 0; i < this->fieldsX; i++)
  41.     {
  42.         for(int j = 0; j < this->fieldsY; j++)
  43.         {
  44.             this->matrix[i][j].Setup();
  45.         }
  46.        
  47.     }
  48. }*/
  49.  
  50. void World::Draw()
  51. {
  52.     for(int i = 0; i < this->fieldsX; i++)
  53.     {
  54.         for(int j = 0; j < this->fieldsY; j++)
  55.         {
  56.             this->matrix[i][j].Draw();
  57.         }
  58.     }
  59. }
  60.  
  61.  
  62. Area::Area()
  63. {
  64.    
  65. }
  66.  
  67. Area::~Area()
  68. {
  69.  
  70. }
  71.  
  72. void Area::Setup(Pos position, int Type)
  73. {
  74.  
  75.     this->pos = position;
  76.     this->type = Type;
  77.     switch(this->type)
  78.     {
  79.     case GRASLAND:
  80.         if(LoadTGA(&this->tex, "gras1.tga"))
  81.         {
  82.             glGenTextures(1, &this->tex.texID);
  83.             glBindTexture(GL_TEXTURE_2D, this->tex.texID);
  84.             glTexImage2D(GL_TEXTURE_2D, 0, this->tex.bpp / 8, this->tex.width, this->tex.height, 0, this->tex.type, GL_UNSIGNED_BYTE, this->tex.imageData);
  85.             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  86.             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  87.  
  88.             if (this->tex.imageData)                        // If Texture Image Exists ( CHANGE )
  89.             {
  90.                 free(this->tex.imageData);                  // Free The Texture Image Memory ( CHANGE )
  91.             }
  92.         }
  93.         else
  94.         {
  95.             exit(1);
  96.         }
  97.  
  98.         break;
  99.     default:
  100.         break;
  101.     }
  102. }
  103.  
  104. void Area::Draw()
  105. {
  106.     glColor3ub(255, 255, 255);
  107.  
  108.     glEnable(GL_TEXTURE_2D);
  109.     glBindTexture(GL_TEXTURE_2D, this->tex.texID);
  110.     glBegin(GL_QUADS);
  111.         glTexCoord2i(0,1);/*    glColor3f(1,0,0);*/ glVertex2i(this->pos.X, this->pos.Y+this->size);
  112.         glTexCoord2i(0,0);/*    glColor3f(0,1,0);*/ glVertex2i(this->pos.X, this->pos.Y);
  113.         glTexCoord2i(1,0);/*    glColor3f(0,0,1);*/ glVertex2i(this->pos.X+this->size, this->pos.Y);
  114.         glTexCoord2i(1,1);/*    glColor3f(1,1,0);*/ glVertex2i(this->pos.X+this->size, this->pos.Y+this->size);
  115.     glEnd();
  116. }
  117.  


In der Hauptschleife rufe ich dann diese Funktion auf:

Code:
  1.  
  2. void Core::InGame()
  3. {
  4.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  5.     glClear(GL_COLOR_BUFFER_BIT);
  6.  
  7.     this->world->Draw();
  8.  
  9.     this->keys = SDL_GetKeyState(NULL);
  10.     if(keys[SDLK_ESCAPE])
  11.     {
  12.         this->done = true;
  13.     } 
  14. }
  15.  


wenn ich in der Area::Draw Funktion glTexCoord2i auskommentiere und stattdessen die Kommentare um glColor3f entferne, erscheinen mir die Quadrate in den Richtigen Farben und auch richtigerweise gegen den Uhrzeigersinn gezeichnet. Die tga Datei liegt auch an der richtigen Stelle, die scheint er auch korrekt zu finden und zu laden. Sieht jemand einen Fehler? Könnte Fehler irgendwo anders im code liegen, in Teilen die ich nicht mitgepostet habe (viel mehr isses nich)?

Bin dankbar für jede Hilfe...


grüße...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 18:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Einen Fehler kann ich nicht finden. Allerdings ist es eine ganz schlechte Idee die Textur für jedes Feld neu zu laden und in den Grafikkartenspeicher zu schieben. Es reicht doch völlig die Textur einmal zu laden (oder prüft das die LoadTGA-Funktion?).

Besitzt deine Textur vielleicht nicht die Breite/Höhe von 2^n? Probier' es mal mit einer Textur der entsprechenden Größe (z.B. 128*128).

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 18:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

1. Kann es sein, dass deine Texturen evtl nicht power of two größen haben? Normal müssen alle OpenGL-Texturen seitenlänge haben die power of two sind...
2. Evtl ist dein Code zum Laden der Textur falsch. Hast du mal überprüft of LoadTGA(...) wirklich true zurück gibt?

Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 18:37 
Offline
DGL Member

Registriert: Mi Mär 22, 2006 17:39
Beiträge: 7
Mahlzeit!

Geht ja fix hier.

Also die tga sind im Format 32x32px. Sollten auch genau in die Quadrate passen, die sind auch 32x32. Die Funktion LoadTGA überprüft zuerst, ob es sich um ne komprimierte oder ne unkomprimierte Datei handelt und ruft entsprechend LoadCompressedTGA(...) oder LoadUnCompressedTGA(...) auf. Da wird mehrfach überprüft, ob das Öffnen und das Lesen der Datei erfolgreich waren. Falls was schief geht, wird false zurückgegeben. Das Fang ich ab mit

if(LoadTGA(&this->tex, "gras1.tga"))
{
glGenTextures(1, &this->tex.texID);
glBindTexture(GL_TEXTURE_2D, this->tex.texID);
glTexImage2D...
....

}
else
{
exit(1);
}

Ansonsten geh ich davon aus das der Loader funktioniert, er wurde mir mehrfach empfohlen, und die Leute von NeHe (denk ich mal) haben das schon ordentlich funktionierend Programmiert. Wegen mangelden eigenen Kenntnissen in Sachen Dateien von Hand lesen (bin da Perl-verwöhnt ;) kann ich aber auch nicht selber überprüfen, ob das korrekt programmiert ist.


Stimmt, das mit dem mehrfachen Laden ist natürlich blödsinn, das werd ich gleich mal in ne extra Funktion auslagern.

danke schonmal, sieht sonst noch jemand was?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 18:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

bin den Code jetzt nochmal bissl genauer durchgegangen und kann in dem schnipsel jetzt auch keinen Fehler entdecken... versuch mal mitm Debugger durchzusteppen und rauszufinden ob 1. die Texturladefunktion richtig funktioniert und ob deine "Areas" richtig initialisiert werden ...

und überprüf mal ob tex.texID beim glBindTexture einen Wert hat ...

Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 19:38 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Zitat:
glTexImage2D(GL_TEXTURE_2D, 0, this->tex.bpp / 8, this->tex.width, this->tex.height, 0, this->tex.type, GL_UNSIGNED_BYTE, this->tex.imageData);


Ich glaube der dritte Parameter is falsch: this->tex.bpp / 8
Der heißt internalFormat und gibt an, wie das intern gemanaged werden soll. Probier mal GL_RGB8 oder GL_RGBA8, je nachdem was this->tex.type ist.

Edit: Im Redbook steht, dass die so ausgelegt sind, dass GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB und GL_RGBA den Zahlen 1, 2, 3 und 4 entsprechen. In sofern müsste es mit this->tex.bpp / 8 doch gehen. Kannst es ja aber trotzdem mal mit GL_RGB / GL_RGB8 bzw. GL_RGBA / GL_RGBA8 versuchen.

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 19:56 
Offline
DGL Member

Registriert: Mi Mär 22, 2006 17:39
Beiträge: 7
Mahlzeit!

Die tex.texID ist 3452816845 (immer die größenordnung). Das sollte in ordnung gehen oder?
tex ist ja eine Objekt der Klasse Textur, die Member width, height, und bpp enthalten nach dem Laden der tga korrekte werte, also 32,32,24. (vielleicht dumme Frage: sollt bpp nicht 32 sein bei Targa?). tex->imageData enthält auch nen ganzen Haufen Daten. Ist es denn richtig diese ImageData gleich wieder mit free freizugeben? Aber auch wenn ich das in den Destruktor der Areas auslagere, bleibt das Fenster weiß.
Also da scheint auch alles in Ordnung zusein.
glBindTexture wie gesagt, bekommt da oben solche IDs.

Die feldmatrix sieht auch gut aus, die Werte werden korrekt initialisiert, ich kann mir die IDs der areas auch in die Konsole ausgeben lassen. Das sieht bis dahin alles sehr gut aus. Wie gesagt, wenn ich statt Texturen Farben auf die Quadrate packe, sieht alles so aus, wie es soll.

Die Texturen sind mit GIMP erstellt, ich hab das jetzt auch in verschiedenen Versionen abgespeichert (komprimiert, unkomprimiert, anfang unten links, ...), das hilft auch nicht.

@AL:

Ich habs probiert, der Compiler akzeptiert GL_RGB8 , aber es bleibt beim weißen Schirm. Gibt es da noch andere Optionen? obwohl das RGB -> 8bit jeweils stimmt ja (ich nehme man an, das sich GL_RGB8 so aufschlüsseln lässt)

jetzt hab ich mal nen Alphakanal in GIMP zur tga zugefügt und GL_RGBA8 eingesetzt -> keine veränderung (aber jetzt ist mir zumindest klar, warum es eben nur 24 in bpp waren, jetzt ist tex->bpp korrekterweiße 32)

*dank und auf weitere Ideen hoff*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 20:12 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Nur mal als kleine Anmerkung am Rande ohne den Thread jetzt gelesen zu haben:
3452816845 = 0xCDCDCDCD = das wie (beispielsweise) Visual C den Speicher initialisiert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 20:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

hab mir den nehe cide mal angesehen ... hast du den exakt so übernommen?
Mir ist nämlich aufgefallen, dass da ne große Sicherheitslücke drin steckt.
Und zwar wird der Rückgabewert von LoadUncompressedTGA und LoadCpmpressedTGA nicht überprüft:
Code:
  1.  
  2. if(memcmp(uTGAcompare, &tgaheader, sizeof(tgaheader)) == 0)
  3. {
  4.     LoadUncompressedTGA(texture, filename, fTGA);
  5. }
  6. else if(memcmp(cTGAcompare, &tgaheader, sizeof(tgaheader)) == 0)
  7. {
  8.     LoadCompressedTGA(texture, filename, fTGA);
  9. }
  10. else
  11. {
  12.     MessageBox(NULL, "TGA file be type 2 or type 10 ", "Invalid Image", MB_OK); // Display an error
  13.     fclose(fTGA);
  14.     return false;  
  15. }
  16. return true;   
  17.  


D.h. egal ob Uncompressed oder Compressed false oder true zurückgeben gibt LoadTGA true zurück...

Da solltest du lieber vor die beiden funktionen ein return schreiben, damit deren Wert zurückgegeben wird.
Hab mir den Code der beiden nicht genau angesehen und hab auch keine Ahnung von TGAs, weiß also nicht ob die nach den Prüfungen in LoadTGA noch false zurückgeben können, aber evtl liegt es daran ...

Ansonsten kommt mir eine solch große texID schon irgendwie komisch vor ...
Initialisier die texIDs mal auf 0 und schau, ob sich der Wert ändert ...

Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 21:08 
Offline
DGL Member

Registriert: Mi Mär 22, 2006 17:39
Beiträge: 7
Mahlzeit!

Die ID bleibt tatsächlich 0, wenn ich sie mit 0 initialisiere... da liegt wohl der Hund begraben...

Wenn ich bei dem tga Loader die return hinzufüge, entstehen trotzdem keine Compiler- oder Laufzeitfehler.

Woher kann das kommen das die ID 0 ist? Die anderen Werte werden ja anscheinend richtig initialisiert....

Ich hab grade mal die Datei TGALoader.cpp nach dem Begriff texID durchsucht. Der kommt dort drinnen nicht vor... Haben die vielleicht vergessen, der Textur nach dem laden ne ID zu verpassen? Wie macht man das, b.z.w. an welcher Stelle bei OpenGL geschieht das?

grüße...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 21:17 
Offline
DGL Member

Registriert: Mi Mär 22, 2006 17:39
Beiträge: 7
achso, ich seh grad, dass das bei glGenTextures geschieht. na jedenfalls bleibt die ID 0...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 21:48 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

So langsam bin ich überfragt ;)
Das einzige was mir noch einfällt ist die möglichkeit, dass er garnicht bis zum glGenTextures kommt (aus irgend einem grund, nicht weil LoadTGA false zurück gibt)
Überprüf mal ob LoadTGA überhaupt aufgerufen wird ...

Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 22:29 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Habs jetzt noch mal etwas genauer überflogen. Wäre es möglich, dass du zum Zeitpunkt wo du Area::Setup aufrufst (was ja im World::World erfolgt) OpenGL noch nicht initialisiert hast?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 22, 2006 22:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Ich gehe mal davon aus, dass du opengl statisch gelinkt hast, also wird es initialisiert sein ... und wenn nicht würds 100% n laufzeitfehler geben ...

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 23, 2006 02:36 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Sorry, aber statisches linken hat wenig mit Initialisierung zu tun. Wenn kein OpenGL-Kontext vorhanden ist (wo Bittiefe und andere Parameter welche nicht durchs linken bekannt sein können erforderlich sind) dann werden auch keine Texturen erstellt und es werden in diesem Fall auch keine Laufzeitfehler auftreten.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.012s | 15 Queries | GZIP : On ]