BMP loading in 'OpenGL Game Programming'
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?
October 23, 2002 10:36 AM
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
Heavy_D33
I wrote my own function, I hope it helps.
BTW, it loads only 8bpp, uncompressed BMPs.
BTW, it loads only 8bpp, uncompressed BMPs.
//load a bmp texture, with the specified global alphaGLuint 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;}
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement
Recommended Tutorials
Advertisement