My Texture Class Wount Work! Please Help.
Okay my texture class seems to not be working because after
i attempt to use the data i load the texture seems to not
exist. Here is the class...
class TEXTURE
{
public:
unsigned char *data; // Stored the bitmap data
unsigned int ID; // the ID of the texture for binding
unsigned int bbc; // color by bit count
unsigned int height; // width of image
unsigned int width; // height of image
///////////////////////////////////////////////
// Prototypes
///////////////////////////////////////////////
bool LoadTexture(char* fileName);
////////////////////////////////////////////////
// Constructor/Deconstructor
////////////////////////////////////////////////
TEXTURE()
{
data = NULL;
ID = 1;
bbc = 0;
height = 0;
width = 0;
}
~TEXTURE()
{
// Lets free up the memory on texture destruction! Memory leaks suck!
if(data != NULL)
{
glDeleteTextures(1, &ID);
delete data;
data = NULL;
}
}
};
///////////////////////////////////////////////////////
// Function definitions
///////////////////////////////////////////////////////
bool TEXTURE::
LoadTexture(char* fileName)
{
BITMAPFILEHEADER bitmapFileHeader; // bitmap file header
int imageIdx = 0; // image index counter
unsigned char tempRGB; // swap variable
BITMAPINFOHEADER bitmapInfoHeader; // bitmap info header
data = NULL;
/////////////////////////////////////////////////////////////
// Load the bitmap
/////////////////////////////////////////////////////////////
// open filename in "read binary" mode
FILE *filePtr = fopen(fileName, "rb");
if (filePtr == NULL)
return false;
// read the bitmap file header
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);
// verify that this is a bitmap by checking for the universal bitmap id
if (bitmapFileHeader.bfType != BITMAP_ID)
{
fclose(filePtr);
return false;
}
// read the bitmap information header
fread(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);
// move file pointer to beginning of bitmap data
fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
// allocate enough memory for the bitmap image data
data = new unsigned char [bitmapInfoHeader.biSizeImage];
// verify memory allocation
if (!data)
{
free(data);
fclose(filePtr);
return false;
}
// read in the bitmap image data
fread(data, 1, bitmapInfoHeader.biSizeImage, filePtr);
// make sure bitmap image data was read
if (data == NULL)
{
fclose(filePtr);
return false;
}
// swap the R and B values to get RGB since the bitmap color format is in BGR
for (imageIdx = 0; imageIdx < bitmapInfoHeader.biSizeImage; imageIdx+=3)
{
tempRGB = data[imageIdx];
data[imageIdx] = data[imageIdx + 2];
data[imageIdx + 2] = tempRGB;
}
// Get the width height and bbc
width = bitmapInfoHeader.biWidth;
height= bitmapInfoHeader.biWidth;
bbc = bitmapInfoHeader.biBitCount;
if(bbc==32)
{
bbc = GL_RGBA;
}
if(bbc==24)
{
bbc = GL_RGB;
}
/////////////////////////////////////////////////////////////
// Load the texture
/////////////////////////////////////////////////////////////
glEnable(GL_TEXTURE_2D); // enable 2D texturing
glGenTextures(1, &ID); // generate texture object
glBindTexture(GL_TEXTURE_2D, ID); // enable our texture object
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
// generate the texture image
glTexImage2D(GL_TEXTURE_2D, 0, bbc, width,
height, 0, bbc, GL_UNSIGNED_BYTE, data);
//gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, bitmapInfoHeader.biWidth, bitmapInfoHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, data);
// close the file and return the bitmap image data
fclose(filePtr);
return true;
}
//////////////////////////////////////////////////////////////
// End
////////////////////////////////////////////////////////////////
So does anyone have any suggestions? I''ve been stuck on this for days! It always seems to not work when i put my code into a class for use
Oh yeah here is a sample of how i use it....
main()
{
TEXTURE blah;
blah.LoadTexture("something.bmp")
.....
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, shane.ID);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(-1,-1,-5);
glTexCoord2f(1,0); glVertex3f(1,-1,-5);
glTexCoord2f(1,1); glVertex3f(1,1,-5);
glTexCoord2f(0,1); glVertex3f(-1,1,-5);
glEnd();
....
return;
}
main()
{
TEXTURE blah;
blah.LoadTexture("something.bmp")
.....
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, shane.ID);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(-1,-1,-5);
glTexCoord2f(1,0); glVertex3f(1,-1,-5);
glTexCoord2f(1,1); glVertex3f(1,1,-5);
glTexCoord2f(0,1); glVertex3f(-1,1,-5);
glEnd();
....
return;
}
Hello there,
First of all I need to say, I''m REALLY new to OpenGL and 3D programming! I have programming experience, but I only started studying these technologies 2 days ago.
Anyway, while I was looking at your code, I was wondering.... Didn''t you switch the width and height properties in your TEXTURE class definition?
unsigned int height; // width of image
unsigned int width; // height of image
And how about this piece of your loading code:
width = bitmapInfoHeader.biWidth;
height= bitmapInfoHeader.biWidth;
It assumed that the texture has equal sizes for width and height. Are they really?
=====
Excuse me if I''m talking nonsense here. It just looks odd to me. I just wanted to point it out. I might be wrong.
Anyhow.. I hope I''m right (newby-luck hehe). And I hope you will find your solution to the problem..
Greetz,
Necrarch
We are only alive because we dream %*
First of all I need to say, I''m REALLY new to OpenGL and 3D programming! I have programming experience, but I only started studying these technologies 2 days ago.
Anyway, while I was looking at your code, I was wondering.... Didn''t you switch the width and height properties in your TEXTURE class definition?
unsigned int height; // width of image
unsigned int width; // height of image
And how about this piece of your loading code:
width = bitmapInfoHeader.biWidth;
height= bitmapInfoHeader.biWidth;
It assumed that the texture has equal sizes for width and height. Are they really?
=====
Excuse me if I''m talking nonsense here. It just looks odd to me. I just wanted to point it out. I might be wrong.
Anyhow.. I hope I''m right (newby-luck hehe). And I hope you will find your solution to the problem..
Greetz,
Necrarch
We are only alive because we dream %*
I read somewhere that with RGB bitmaps, the biSizeImage field can be zero. You might want to check if it is zero, and if so, store width * height * 3 in it.
Also, in your glTexImage2D call, you use bbc twice, containing the value GL_RGB or GL_RGBA. In the first instance, that field is the number of bytes per pixel, so 3 or 4. But in my implementation, GL_RGB is 0x1907 and GL_RGBA is 0x1908, so that could definitely be a problem. Try placing 3 in that field for an RGB image.
Also, in your glTexImage2D call, you use bbc twice, containing the value GL_RGB or GL_RGBA. In the first instance, that field is the number of bytes per pixel, so 3 or 4. But in my implementation, GL_RGB is 0x1907 and GL_RGBA is 0x1908, so that could definitely be a problem. Try placing 3 in that field for an RGB image.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement