BMP loading in 'OpenGL Game Programming'

Started by
3 comments, last by infrmtn 21 years, 5 months ago
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?
Advertisement
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
Changing the color depth doesn''t help..
I wrote my own function, I hope it helps.
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;}  
Thanks.
I''ll look into it later. Been a bit busy now..

This topic is closed to new replies.

Advertisement