Texturing Problem

Started by
1 comment, last by Niddles 16 years, 11 months ago
I am making an asteroids game, and I have 2 different 3ds models loaded. I load the textures from .tga's and try to texture both models with their respective images. For some reason I have it texturing both with the same texture. Also, it is not even using the texture it is just using the main color out of the texture. Can someone help me solve these problems? Here's some source to help you figure out what is going on.

//TGA class
class zTGAImage
{

	public :


	// UBYTE pointer to hold the entire image 
	unsigned char *image;
	// no. of bytes per pixel (3 for RGB, 4 for RGBA)
    int channels;
	// image ID
	unsigned int ID;
	//image width and height
	int imageWidth;
    int imageHeight;
	
	// function prototypes
	zTGAImage();
	bool Load(char*);
	void Free();
	~zTGAImage();

};

//TGA Loader
bool zTGAImage::Load(char *fileName)
{
	Free(); // free any previous image loaded

	FILE *image_file;
	unsigned char tempColor;
	unsigned char bitCount;
	long tgaSize;
	unsigned char UncompressedHeader[12] = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0};
	unsigned char tgaHeader[12];
	unsigned char imageHeader[6];
	long index;

	if(!fileName)
	{
		// output error at console
		return false;
	}

	image_file = fopen(fileName, "rb");

	if(!image_file)
	{
		// output error at console
		return false;
	}



	// read the header
	fread(tgaHeader, 1, sizeof(tgaHeader), image_file);

	// make sure it is uncompressed tga
	if(memcmp(UncompressedHeader, tgaHeader, sizeof(UncompressedHeader))!=0)
	{
		// output error to console
		fclose(image_file);
		return false;
	}

	// read image header
    fread(imageHeader, 1, sizeof(imageHeader), image_file);

	// convert from base 256 to decimal base
	imageWidth = imageHeader[1] * 256 + imageHeader[0];
	imageHeight = imageHeader[3] * 256 + imageHeader[2];

	// read the bits per pixel
	bitCount = imageHeader[4];

	channels = bitCount / 8; // BGR or BGRA

	// calculate the number of bytes taken by the image
	tgaSize = imageWidth * imageHeight * channels;

    // allocate memory for the image and load it
    image = new unsigned char[sizeof(unsigned char) * tgaSize];
    fread(image, sizeof(unsigned char), tgaSize, image_file);


    // convert BGR to RGB
    for(index = 0; index < tgaSize; index += channels)
	{
		tempColor = image[index];
		image[index] = image[index + 2];
		image[index + 2] = tempColor;
	}
	glPushMatrix();
    glGenTextures(1, &ID);
    glBindTexture(GL_TEXTURE_2D, ID);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, imageWidth, imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);	
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);	
    glPopMatrix();
	// close the image
	fclose(image_file);

	// if all went ok, return true
	return true;
}

//In an init function

shipimage.Load("ship.tga");
rockimage.Load("rocktexture.tga");
//In a rendering function
shipmodel.Render(shipimage.ID)
rockmodel.Render(rockmodel.ID)

//The rendering function
void z3DSModel::Render(unsigned char texID)
{
    glPushMatrix();
	// set color as white
	glColor3f(1.0f, 1.0f, 1.0f);

	// begin rendering triangles
	glBegin(GL_TRIANGLES);

	// loop through all the meshes
	for(int i=0; i<totalMeshes; i++)
	{

        // Draw each triangle of this mesh.
		for(unsigned int f=0; f<meshList.totalFaces; f++)
		{
			// Get pointers to make the below code cleaner.
			stMesh *pMesh = &meshList;
			stFace *pFace = pMesh->pFaces;
			stTexCoord *pTexCoord = pMesh->pTexCoords;
			
			// If one or both or NULL, we got a problem.
			if(!pMesh || !pFace) continue;

			
			// Draw the a triangle, with texture coordinates and normals for
			// each vertex.
            glBindTexture(GL_TEXTURE_2D, texID);
			glNormal3f(pFace[f].normal.x, pFace[f].normal.y,
					   pFace[f].normal.z);

			int index1 = pFace[f].indices[0], index2 = pFace[f].indices[1], index3 = pFace[f].indices[2];
			
			if(pTexCoord)
				glTexCoord2f(pTexCoord[index1].tu, pTexCoord[index1].tv);
			
			glVertex3f(pMesh->pVertices[index1].x, pMesh->pVertices[index1].y, pMesh->pVertices[index1].z); 
		    
			if(pTexCoord)
				glTexCoord2f(pTexCoord[index2].tu, pTexCoord[index2].tv);
			
			glVertex3f(pMesh->pVertices[index2].x, pMesh->pVertices[index2].y, pMesh->pVertices[index2].z); 
			
			if(pTexCoord)
				glTexCoord2f(pTexCoord[index3].tu, pTexCoord[index3].tv);
			
			glVertex3f(pMesh->pVertices[index3].x, pMesh->pVertices[index3].y, pMesh->pVertices[index3].z); 
		}
	
	}

	// end drawing triangles
	glEnd();
	glPopMatrix();
}

Thanks if anyone can help. =)
Advertisement
Try this:

//TGA classclass zTGAImage{	public :	// UBYTE pointer to hold the entire image 	unsigned char *image;	// no. of bytes per pixel (3 for RGB, 4 for RGBA)    int channels;	// image ID	unsigned int ID;	//image width and height	int imageWidth;    int imageHeight;		// function prototypes	zTGAImage();	bool Load(char*);	void Free();	~zTGAImage();};//TGA Loaderbool zTGAImage::Load(char *fileName){	Free(); // free any previous image loaded	FILE *image_file;	unsigned char tempColor;	unsigned char bitCount;	long tgaSize;	unsigned char UncompressedHeader[12] = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0};	unsigned char tgaHeader[12];	unsigned char imageHeader[6];	long index;	if(!fileName)	{		// output error at console		return false;	}	image_file = fopen(fileName, "rb");	if(!image_file)	{		// output error at console		return false;	}	// read the header	fread(tgaHeader, 1, sizeof(tgaHeader), image_file);	// make sure it is uncompressed tga	if(memcmp(UncompressedHeader, tgaHeader, sizeof(UncompressedHeader))!=0)	{		// output error to console		fclose(image_file);		return false;	}	// read image header    fread(imageHeader, 1, sizeof(imageHeader), image_file);	// convert from base 256 to decimal base	imageWidth = imageHeader[1] * 256 + imageHeader[0];	imageHeight = imageHeader[3] * 256 + imageHeader[2];	// read the bits per pixel	bitCount = imageHeader[4];	channels = bitCount / 8; // BGR or BGRA	// calculate the number of bytes taken by the image	tgaSize = imageWidth * imageHeight * channels;    // allocate memory for the image and load it    image = new unsigned char[sizeof(unsigned char) * tgaSize];    fread(image, sizeof(unsigned char), tgaSize, image_file);    // convert BGR to RGB    for(index = 0; index < tgaSize; index += channels)	{		tempColor = image[index];		image[index] = image[index + 2];		image[index + 2] = tempColor;	}	glPushMatrix();    glGenTextures(1, &ID);    glBindTexture(GL_TEXTURE_2D, ID);    glTexImage2D(GL_TEXTURE_2D, 0, 3, imageWidth, imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image);    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);	    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);	    glPopMatrix();	// close the image	fclose(image_file);	// if all went ok, return true	return true;}//In an init functionshipimage.Load("ship.tga");rockimage.Load("rocktexture.tga");//In a rendering functionshipmodel.Render(shipimage.ID)rockmodel.Render(rockmodel.ID)//The rendering functionvoid z3DSModel::Render(unsigned char texID){    glPushMatrix();	// set color as white	glColor3f(1.0f, 1.0f, 1.0f);         glBindTexture(GL_TEXTURE_2D, texID);	// begin rendering triangles	glBegin(GL_TRIANGLES);	// loop through all the meshes	for(int i=0; i<totalMeshes; i++)	{        // Draw each triangle of this mesh.		for(unsigned int f=0; f<meshList.totalFaces; f++)		{			// Get pointers to make the below code cleaner.			stMesh *pMesh = &meshList;			stFace *pFace = pMesh->pFaces;			stTexCoord *pTexCoord = pMesh->pTexCoords;						// If one or both or NULL, we got a problem.			if(!pMesh || !pFace) continue;						// Draw the a triangle, with texture coordinates and normals for			// each vertex.			glNormal3f(pFace[f].normal.x, pFace[f].normal.y,					   pFace[f].normal.z);			int index1 = pFace[f].indices[0], index2 = pFace[f].indices[1], index3 = pFace[f].indices[2];						if(pTexCoord)				glTexCoord2f(pTexCoord[index1].tu, pTexCoord[index1].tv);						glVertex3f(pMesh->pVertices[index1].x, pMesh->pVertices[index1].y, pMesh->pVertices[index1].z); 		    			if(pTexCoord)				glTexCoord2f(pTexCoord[index2].tu, pTexCoord[index2].tv);						glVertex3f(pMesh->pVertices[index2].x, pMesh->pVertices[index2].y, pMesh->pVertices[index2].z); 						if(pTexCoord)				glTexCoord2f(pTexCoord[index3].tu, pTexCoord[index3].tv);						glVertex3f(pMesh->pVertices[index3].x, pMesh->pVertices[index3].y, pMesh->pVertices[index3].z); 		}		}	// end drawing triangles	glEnd();	glPopMatrix();}



don't use function glBindTexture() betwen glBegin() and glEnd()
Aha! That was it. Thanks very much.

This topic is closed to new replies.

Advertisement