Текстура OpenGL смещена на квад - PullRequest
2 голосов
/ 07 июня 2010

У меня были проблемы с этим в течение некоторого времени, и я еще не получил ни одного решения, которое работает. Здесь проблема и специфика:

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

Вот скриншот, сравнивающий TGA (слева) и то, как он работает в программе (справа) для ясности. Также обратите внимание, что в верхнем правом углу есть крошечный черный пиксель, я надеюсь, что это связано с той же проблемой.

альтернативный текст http://img64.imageshack.us/img64/2686/helpmed.png

Вот код для загрузчика, я убежден, что моя проблема заключается в способе загрузки текстуры.

Заранее спасибо всем, кто может решить мою проблему.

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);          

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 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_NEAREST);
 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

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

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

Похоже, вы используете заголовок дважды (один раз в TGA::loadTGA, а затем снова в LoadUncompressedTGA).

Но если бы это было так, то я бы подумал, что width, height и bpp - все будет в корне неверно, и это не будет выглядеть так же правильно, как и раньше.

1 голос
/ 07 июня 2010

Вот скриншот, сравнивающий TGA (слева) и то, как он работает в программе (справа) для ясности.Также обратите внимание, что в верхнем правом углу есть крошечный черный пиксель, я надеюсь, что это связано с той же проблемой.

Похоже, что процедура загрузки не работает - что-то явно "съедает" два пикселя(при условии, что линии сканирования переходят из дна в верх).Это не проблема OPENGL, это ошибка где-то в вашей процедуре загрузки.

Я не знаком с форматом * .tga, но вы можете сравнить вашу процедуру загрузки среализация из библиотеки SDL_image .Насколько я знаю, SDL_image загружает изображения правильно.Так как ваша рутина не делает этого, это ошибка в вашей рутине.Сравните вашу процедуру с рабочим кодом, чтобы найти ошибку.

Будьте осторожны с лицензированием, если вы решите скопировать код SDL_image в свой проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...