gpt4 book ai didi

c++ - 应用于四边形时,OpenGL 纹理稍微向左移动

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:57 26 4
gpt4 key购买 nike

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

最佳答案

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

关于c++ - 应用于四边形时,OpenGL 纹理稍微向左移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2983827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com