Структура OpenGL сместилась несколько налево при применении к четверке

Я немного плохо знаком с OpenGL, и у меня была проблема с использованием структур. Структура, кажется, загружается прекрасный, но когда я запускаю программу, дисплеи структуры сместили пару пикселей налево с разделом, отключенным сдвигом, появляющимся на правой стороне. Я не знаю, находится ли проблема здесь в моем загрузчике TGA или если это - способ, которым я применяю структуру к четверке.

Вот загрузчик:

#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;
}

И вот четверка:

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();
}
6
задан Whynne 6 June 2010 в 10:18
поделиться

2 ответа

Снимок экрана был бы очень полезен.
Мое первое предположение заключается в том, что ваши строки не выровнены по 4 байта. Если это так, измените выравнивание распаковки на 1 байт с помощью glPixelStorei(GL_UNPACK_ALIGNMENT, 1); перед вызовом glTexImage2D().

3
ответ дан 17 December 2019 в 02:24
поделиться

Вы хотите установить параметр текстуры так, чтобы текстура масштабировалась в соответствии с квадратом. Это можно сделать с помощью следующих строк кода:

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

Это позволит текстуре линейно масштабироваться вверх или вниз, чтобы соответствовать квадрату.

Возможно, вам также следует зажать текстуру с помощью следующих вызовов:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3
ответ дан 17 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: