Archived

This topic is now archived and is closed to further replies.

infrmtn

BMP loading in 'OpenGL Game Programming'

Recommended Posts

infrmtn    100
I don''t really know much about these things, but I do know that the BMP loading example from the book called OpenGL Game Programming doesn''t work with the OpenGL basecode from NeHe. It just doesn''t show the BMP file. After playing around with it for about an hour and getting frustrated, I couldn''t find the problem. So has someone been able to use the BMP loading example from the book with NeHe''s basecode?

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
I think I remember to running into this problem a while back. I''m not in front of my programming comp right now, so I can''t test what I''m getting ready to say, so take it with a grain of salt. When I tried to use the BMP''s that NeHe posted, they wouldn''t work. I had to open the images in a paint program (I used Paint Shop Pro) and change the color depth and then change it back and resave it. If I didn''t do this, the images just showed up as blank. Hope this helps!

Heavy_D33

Share this post


Link to post
Share on other sites
Raduprv    997
I wrote my own function, I hope it helps.
BTW, it loads only 8bpp, uncompressed BMPs.


  
//load a bmp texture, with the specified global alpha

GLuint load_bmp8_fixed_alpha(char * FileName, Uint8 a)
{
int i,x,y,x_padding,x_size,y_size,colors_no,r,g,b,current_pallete_entry;
Uint8 * file_mem;
Uint8 * file_mem_start;
Uint8 * texture_mem;
Uint8 * read_buffer;
Uint8 * color_pallete;
FILE *f = NULL;
int file_lenght;
GLuint texture;

f = fopen (FileName, "rb");
if (!f) return;
file_mem = (Uint8 *) calloc ( 20000, sizeof(Uint8));
file_mem_start=file_mem;
fread (file_mem, 1, 50, f);//header only

//now, check to see if our bmp file is indeed a bmp file, and if it is 8 bits, uncompressed

if(*((short *) file_mem)!=19778)//BM (the identifier)

{
free(file_mem_start);
fclose (f);
return -1;
}
file_mem+=18;
x_size=*((int *) file_mem);
file_mem+=4;
y_size=*((int *) file_mem);
file_mem+=6;
if(*((short *)file_mem)!=8)//8 bit/pixel?

{
free(file_mem_start);
fclose (f);
return -1;
}

file_mem+=2;
if(*((int *)file_mem)!=0)//any compression?

{
free(file_mem_start);
fclose (f);
return -1;
}
file_mem+=16;

colors_no=*((int *)file_mem);
if(!colors_no)colors_no=256;
file_mem+=8;//here comes the pallete


color_pallete=file_mem+4;
fread (file_mem, 1, colors_no*4+4, f);//header only

file_mem+=colors_no*4;

x_padding=x_size%4;
if(x_padding)x_padding=4-x_padding;

//now, allocate the memory for the file

texture_mem = (Uint8 *) calloc ( x_size*y_size*4, sizeof(Uint8));
read_buffer = (Uint8 *) calloc ( 2000, sizeof(Uint8));


for(y=0;y<y_size;y++)
{
//fread (texture_mem+y*x_size, 1, x_size-x_padding, f);

fread (read_buffer, 1, x_size-x_padding, f);

for(x=0;x<x_size;x++)
{
current_pallete_entry=*(read_buffer+x);
b=*(color_pallete+current_pallete_entry*4);
g=*(color_pallete+current_pallete_entry*4+1);
r=*(color_pallete+current_pallete_entry*4+2);
*(texture_mem+(y*x_size+x)*4)=r;
*(texture_mem+(y*x_size+x)*4+1)=g;
*(texture_mem+(y*x_size+x)*4+2)=b;
*(texture_mem+(y*x_size+x)*4+3)=a;
}

}

free(file_mem_start);
free(read_buffer);
fclose (f);
//ok, now, hopefully, the file is loaded and converted...

//so, assign the texture, and such


glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA,
x_size, y_size,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
texture_mem);

free(texture_mem);
return texture;
}

Share this post


Link to post
Share on other sites