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:
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;
} |