2010-06-06 15 views
6

Soy un poco nuevo en OpenGL y he estado teniendo problemas con el uso de texturas. La textura parece cargar bien, pero cuando ejecuto el programa, la textura muestra un par de píxeles hacia la izquierda, con la sección cortada por el desplazamiento que aparece en el lado derecho. No sé si el problema aquí está en mi cargador TGA o si es la forma en que estoy aplicando la textura al quad.La textura de OpenGL se desplazó un poco hacia la izquierda cuando se aplicaba a un quad

Aquí es el cargador:

#include "texture.h" 
#include <iostream> 

GLubyte uncompressedheader[12] = {0,0, 2,0,0,0,0,0,0,0,0,0}; 
GLubyte compressedheader[12] = {0,0,10,0,0,0,0,0,0,0,0,0}; 


TGA::TGA() 
{ 

} 

//Private loading function called by LoadTGA. Loads uncompressed TGA files 
//Returns: TRUE on success, FALSE on failure 
bool TGA::LoadCompressedTGA(char *filename,ifstream &texturestream) 
{ 
return false; 
} 

bool TGA::LoadUncompressedTGA(char *filename,ifstream &texturestream) 
{ 
cout << "G position status:" << texturestream.tellg() << endl; 
texturestream.read((char*)header, sizeof(header));  //read 6 bytes into the file to get the tga header 
width = (GLuint)header[1] * 256 + (GLuint)header[0]; //read and calculate width and save 
height = (GLuint)header[3] * 256 + (GLuint)header[2]; //read and calculate height and save 
bpp = (GLuint)header[4];   //read bpp and save 

cout << bpp << endl; 

if((width <= 0) || (height <= 0) || ((bpp != 24) && (bpp !=32))) //check to make sure the height, width, and bpp are valid 
{ 
    return false; 
} 
if(bpp == 24)   
{ 
    type = GL_RGB; 
} 
else 
{ 
    type = GL_RGBA; 
} 
imagesize = ((bpp/8) * width * height);   //determine size in bytes of the image 
cout << imagesize << endl; 
imagedata = new GLubyte[imagesize];   //allocate memory for our imagedata variable 

texturestream.read((char*)imagedata,imagesize);  //read according the the size of the image and save into imagedata 

for(GLuint cswap = 0; cswap < (GLuint)imagesize; cswap += (bpp/8))   //loop through and reverse the tga's BGR format to RGB 
{ 
    imagedata[cswap] ^= imagedata[cswap+2] ^=     //1st Byte XOR 3rd Byte XOR 1st Byte XOR 3rd Byte 
    imagedata[cswap] ^= imagedata[cswap+2]; 
} 

texturestream.close();    //close ifstream because we're done with it 
cout << "image loaded" << endl; 

glGenTextures(1, &texID);    // Generate OpenGL texture IDs 
glBindTexture(GL_TEXTURE_2D, texID);   // Bind Our Texture 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Filtered 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, type, width, height, 0, type, GL_UNSIGNED_BYTE, imagedata); 



    delete imagedata; 
return true; 
} 

//Public loading function for TGA images. Opens TGA file and determines 
//its type, if any, then loads it and calls the appropriate function. 
//Returns: TRUE on success, FALSE on failure 

bool TGA::loadTGA(char *filename) 
{ 
cout << width << endl; 
ifstream texturestream; 
texturestream.open(filename,ios::binary); 
texturestream.read((char*)header,sizeof(header));  //read 6 bytes into the file, its the header.    //if it matches the uncompressed header's first 6 bytes, load it as uncompressed 
LoadUncompressedTGA(filename,texturestream); 
return true; 
} 

GLubyte* TGA::getImageData() 
{ 
return imagedata; 
} 

GLuint& TGA::getTexID() 
{ 
return texID; 
} 

Y aquí está el patio:

void Square::show() 
{  

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, texture.texID); 


    //Move to offset 
    glTranslatef(x, y, 0); 

//Start quad 
    glBegin(GL_QUADS); 

//Set color to white 
glColor4f(1.0, 1.0, 1.0, 1.0); 

//Draw square 
glTexCoord2f(0.0f, 0.0f); glVertex3f(0,   0,    0); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(SQUARE_WIDTH, 0,    0); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(SQUARE_WIDTH, SQUARE_HEIGHT, 0); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(0,   SQUARE_HEIGHT, 0); 

    //End quad 
    glEnd(); 

    //Reset 
glLoadIdentity(); 
} 
+0

favor añadir una captura de pantalla – Bahbar

Respuesta

2

Una captura de pantalla sería muy útil.
Mi primera suposición es que sus filas no están alineadas a 4 bytes. Si es así, cambie la alineación de desempaquetar en 1 byte con glPixelStorei(GL_UNPACK_ALIGNMENT, 1); antes de llamar a glTexImage2D().

3

Desea establecer el parámetro de textura para que la textura se ajuste al cuadricepe. Puedes hacer eso con las siguientes líneas de código:

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

Estos tendrán texturas aumentan linealmente hacia arriba o hacia abajo para encajar el patio.

Debería probablemente sujetar la textura con las siguientes llamadas:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
Cuestiones relacionadas