【问题标题】:OpenGL texture shifted somewhat to the left when applied to a quad当应用于四边形时,OpenGL 纹理稍微向左移动
【发布时间】:2010-06-06 20:34:20
【问题描述】:

我对 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();
}

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    截图会很有帮助。
    我的第一个猜测是您的行不是 4 字节对齐的。如果是这样,请在调用 glTexImage2D() 之前使用 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 将解包对齐更改为 1 个字节。

    【讨论】:

      【解决方案2】:

      您想设置纹理参数,以便纹理缩放以适合四边形。您可以使用以下代码行来做到这一点:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多