Sign in to follow this  
DiNeRo

SDL help

Recommended Posts

DiNeRo    100
ive spent hours googling around trying to find wth it doesnt work...

i load a texture using

int loadTexture ( char *filename ) {
GLuint retval;
SDL_Surface *sdlimage;
void *raw;
int w, h, i, j, bpp;
Uint8 *srcPixel, *dstPixel;
Uint32 truePixel;
GLenum errorCode;

sdlimage = IMG_Load(filename);

if ( !sdlimage ) {
printf("SDL_Image load error: %s\n", IMG_GetError());
return 0;
}
if ( sdlimage->format->BytesPerPixel < 2 ) {
printf("Bad image -- not true color!\n");
return 0;
}

w = sdlimage->w;
h = sdlimage->h;

raw = (void *)malloc( w * h * 4 );
dstPixel = (Uint8 *)raw;

SDL_LockSurface( sdlimage );

bpp = sdlimage->format->BytesPerPixel;

for ( i = h ; i > 0 ; i-- ) {
for ( j = 0 ; j < w ; j++ ) {
srcPixel = (Uint8 *)sdlimage->pixels + i * sdlimage->pitch + j * bpp;
switch (bpp) {
case 1:
truePixel = *srcPixel;
break;

case 2:
truePixel = *(Uint16 *)srcPixel;
break;

case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
truePixel = srcPixel[0] << 16 | srcPixel[1] << 8 | srcPixel[2];
} else {
truePixel = srcPixel[0] | srcPixel[1] << 8 | srcPixel[2] << 16;
}
break;

case 4:
truePixel = *(Uint32 *)srcPixel;
break;

default:
printf("Image bpp of %d unusable\n", bpp);
return 0;
break;
}
SDL_GetRGBA( truePixel, sdlimage->format, &(dstPixel[0]), &(dstPixel[1]), &(dstPixel[2]), &(dstPixel[3]));
dstPixel++;
dstPixel++;
dstPixel++;
dstPixel++;
}
}

SDL_UnlockSurface( sdlimage );
SDL_FreeSurface( sdlimage );

glGenTextures( 1, &retval );
glBindTexture( GL_TEXTURE_2D, retval );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

errorCode = glGetError();
if ( errorCode != 0 ) {
if ( errorCode == GL_OUT_OF_MEMORY ) {
printf("Out of texture memory!\n");
}
return 0;
}

gluBuild2DMipmaps( GL_TEXTURE_2D, 4, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (Uint8 *)raw);

errorCode = glGetError();
if ( errorCode != 0 ) {
if ( errorCode == GL_OUT_OF_MEMORY ) {
printf("Out of texture memory!\n");
}
return 0;
}

return retval;
}


put the value in a global var called menu, when i try to texture it onto a quad using


glBindTexture(GL_TEXTURE_2D, menu);
glTexEnvf(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE,GL_REPLACE);
glBegin( GL_QUADS );
glTexCoord2d(0.0,0.0); glVertex2d(0.0,0.0);
glTexCoord2d(1.0,0.0); glVertex2d(1.0,0.0);
glTexCoord2d(1.0,1.0); glVertex2d(1.0,1.0);
glTexCoord2d(0.0,1.0); glVertex2d(0.0,1.0);
glEnd();


i get an untextured basic quad... i really dont know wth is wrong with it... also if anyone could tell me how to have this quad over all other objects in the scene(need it for a 2d hud kind of thing) aswell, id be very grateful


thanks!

Share this post


Link to post
Share on other sites
rip-off    10976
Have you enabled GL_TEXTURE_2D?

The SDL source includes an example program to convert SDL_Surfaces into OpenGL textures. This is a complete example that includes rendering. Why not take a look and see what else you might be missing.

Using the well tested "SDL_GL_LoadTexture()" function included over the one that you have would also be a good idea.

Share this post


Link to post
Share on other sites
Sign in to follow this