Toon posts:

[C++/OpenGL]Segmentation fault met textures laden

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleem met het laden van textures in een OpenGL programma. De onderstaande code zou een texture moeten inladen uit het bestand "texture.bmp", maar als ik de code compileer en uitvoer krijg ik een segmentation fault. De boosdoener (of in iedergeval de functie die het triggered) is gluBuild2DMipmaps(), maar ik weet verder niet wat en waar ik wat fout doe.

Ook zijn er hier nog twee rare dingen: ten eerste doet (deed) de code het WEL als je het niet in een class plaatst, maar direct in de main() functie zet, en ten tweede krijg ik alleen maar een segmentation fault onder Linux (heb in mijn wanhopige uren de code ook een keer in windows uitgeprobeerd, en daar laadde de code geen texture in (de plaats van texture bleef gewoon wit), maar liep hij ook niet vast).

Het gekke hieraan is ook dat ik er pas heel laat achter kwam, want ik had het grootste deel van het spel al klaar, inclusief de texture laad code, maar kwam er pas achter dat er iets niet klopte toen ik de texturelaad code ging verplaaten naar een eigen class die alle benodigde textures in 1x in laadde en beheerde. Nog gekker is dat het toen (begin stand) een hele tijd werkte, terwijl ik dat nu niet meer kan re-produceren... Hier volgt de betreffende code, en iig al vast bedankt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//g++ broken.cpp -o program.bin -lSDL -lGL -lGLU

#include <iostream>
#include <string>

#include <SDL/SDL.h>

#include <GL/gl.h>
#include <GL/glu.h>

class Dummy
{
public:
    Dummy()
    {
        X = -2.5f;
        Y = -2.5f;

        W = 5.0f;
        H = 5.0f;
    
        TheTexture = this->LoadTextureBMP("texture.bmp");
    }
    
    ~Dummy(){}

    void DrawTextures()
    {
            glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, TheTexture);
                    
            glBegin( GL_QUADS );
                glColor3f(1.0f, 1.0f, 1.0f);
                glTexCoord2d(1.0,1.0); glVertex2d(X , Y);
                glTexCoord2d(0.0,1.0); glVertex2d(X + W, Y);
                glTexCoord2d(0.0,0.0); glVertex2d(X + W, Y + H);
                glTexCoord2d(1.0,0.0); glVertex2d(X, Y + H);
            glEnd();
    }
    
    GLuint LoadTextureBMP(std::string filename, bool Repeat = false)
    {
        GLuint NewTexture;
        
        SDL_Surface *texture_surface = SDL_LoadBMP(filename.c_str());
        
        if (texture_surface == NULL)
        {
            std::cout << "fout: kan het bestand \"" << filename << "\" niet vinden.\n";
            return NewTexture;
        }   
         
        glGenTextures(1, &NewTexture);
        glBindTexture(GL_TEXTURE_2D, NewTexture);  

        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
    
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, Repeat ? GL_REPEAT : GL_CLAMP );
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, Repeat ? GL_REPEAT : GL_CLAMP ); 

        // Hier loopt hij vast
        gluBuild2DMipmaps( GL_TEXTURE_2D, 3, texture_surface->w, texture_surface->h, GL_BGR_EXT, GL_UNSIGNED_BYTE, (GLbyte*)texture_surface->pixels);
        // Hier komt hij nooit
        
        SDL_FreeSurface(texture_surface);   
        return NewTexture;
    }
private:
    GLfloat X;
    GLfloat Y;
    GLfloat W;
    GLfloat H;
    GLuint TheTexture;
};

int main(int argc, char* argv[])
{
    Dummy Textures;
    SDL_Init(SDL_INIT_VIDEO);
    SDL_SetVideoMode(800, 600, 32, SDL_OPENGL);
    
    SDL_Event game_event;
 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
 
    for (bool exit_program = false; exit_program == false;)
    {
        while(SDL_PollEvent(&game_event))
        {
            switch (game_event.type)
            {
                case SDL_QUIT: exit_program = true; break;
            }
        }   

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        glOrtho(-10, 10, -10, 10, -10, 10);
        Textures.DrawTextures();       
        SDL_GL_SwapBuffers();
    }
    return 0;
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

WAAR krijg je de segmentation fault? We gaan je code natuurlijk niet doorspitten op zoek naar fouten ;)

PS. [code=c++]...[/code] geeft syntax highlighting

[ Voor 28% gewijzigd door .oisyn op 24-05-2005 11:02 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
En op welke pointer waarde? 0?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah wacht, regel 64
C++:
63
64
65
        // Hier loopt hij vast
        gluBuild2DMipmaps( GL_TEXTURE_2D, 3, texture_surface->w, texture_surface->h, GL_BGR_EXT, GL_UNSIGNED_BYTE, (GLbyte*)texture_surface->pixels);
        // Hier komt hij nooit


2 Vragen die in mij opkomen:
- Is je texture wel degelijk (minstens) 24 bpp?
- Moet je SDL_Init (in main, regel 81) niet aanroepen voordat je textures gaat laden?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 19:11

Cyphax

Moderator LNX
.oisyn schreef op dinsdag 24 mei 2005 @ 12:31:
Ah wacht, regel 64
C++:
63
64
65
        // Hier loopt hij vast
        gluBuild2DMipmaps( GL_TEXTURE_2D, 3, texture_surface->w, texture_surface->h, GL_BGR_EXT, GL_UNSIGNED_BYTE, (GLbyte*)texture_surface->pixels);
        // Hier komt hij nooit


2 Vragen die in mij opkomen:
- Is je texture wel degelijk (minstens) 24 bpp?
- Moet je SDL_Init (in main, regel 81) niet aanroepen voordat je textures gaat laden?
The first SDL function that any program calls must be SDL_Init.
bron: http://andrew.textux.com/tutorials/tut1/tutorial1.html
Wat jij zegt klopt dus, maar WuzzBoy maakt eerst dat object aan waardoor loadTextureBMP uitgevoerd wordt, op dat moment is SDL_Init helemaal nog niet aangeroepen zoals ik het lees. :)
Dan zou regels 81 en 80 omwisselen het probleem op kunnen lossen :)

[ Voor 3% gewijzigd door Cyphax op 24-05-2005 12:35 ]

Saved by the buoyancy of citrus


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Cyphax schreef op dinsdag 24 mei 2005 @ 12:35:
maar WuzzBoy maakt eerst dat object aan waardoor loadTextureBMP uitgevoerd wordt, op dat moment is SDL_Init helemaal nog niet aangeroepen zoals ik het lees. :)
Dat is idd de reden van mijn opmerking :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
* slaat zichzelf voor de kop 8)7 *

Bedankt iedereen, dit was inderdaad de fout, dom dat ik daar overheen keek... Maar wel gek (of iig jammer) dat hij niet meteen de fout in gaat, maar eerst gewoon doet of er niet aan de hand is, en pas stopt als al lang niet meer verwacht dat de fout kan liggen in dat ene stukje code wat al meer dan 500 regels code goed werkt... Of misschien had ik daar toch wat return values moeten checken? O-) Ow, en ja, de texturere was wel degelijk 24 bbp :), maar wist dat dit niet de fout was omdat 1) hij precies de zelfde fout aan gaf met sample code van een site, met RAW textures en 2) omdat hij het plaatje op 1 of andere manier soms wel goed (als in perfect) weergaf (waar ik waarschijnlijk LoadTextureBMP() NA SDL_Init() aanriep.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10:04
Btw, het is gebruikelijk om objecten als const ref mee te geven aan een functie als je er niets aan verandert, en anders als pointer, scheelt een kopieeractie.

Tis een beetje geneuzel magoed :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1