正如标题所示,我一直在加载.tga文件时遇到问题。我一直在使用this作为参考,据我所知(除了使用C++函数而不是c函数),我正在做同样的事情。我确实得到了一个纹理,但它应该是一个乱码版本,我不确定为什么。请原谅所有错误,我只是想让它工作。加载Targa文件的问题文件C++
页眉:
struct TGA
{
GLuint Load(const char* filename);
unsigned char header_[12];
unsigned char bpp_;
unsigned char id_;
unsigned short width_;
unsigned short height_;
unsigned char* data_;
};
.cpp的:
GLuint TGA::Load(const char* filename)
{
width_ = 0; height_ = 0;
bpp_ = 32; id_ = 8;
data_ = 0;
std::ifstream file;
file.open(filename, std::ios::binary | std::ios::ate);
if(file.fail())
{
std::cout<<filename<<" could not be opened."<<std::endl;
return 0;
}
file.seekg(0, std::ios::beg);
file.read((char*)header_, sizeof(unsigned char)*12);
file.read((char*)&width_, sizeof(unsigned short));
file.read((char*)&height_, sizeof(unsigned short));
file.read((char*)&bpp_, sizeof(unsigned char));
file.read((char*)&id_, sizeof(unsigned char));
int imageSize = width_ * height_;
std::cout<<imageSize<<std::endl;
data_ = new unsigned char[imageSize * 3]; //3 means RGB
file.read((char*)data_, imageSize * 3);
file.close();
GLuint texture;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width_, height_, 0, GL_BGRA, GL_UNSIGNED_BYTE, data_);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width_, height_, GL_RGBA, GL_UNSIGNED_BYTE, data_);
delete [] data_;
return texture;
}
不是一个答案..但.. ..确保填充和一次读取!如果你想让它变得可移植,请不要忘记endianess .. – 2012-01-28 17:06:12
阅读文件头后是什么'bpp_'? (弗拉德:我相信TGA不像BMP那样填充)。 – user7116 2012-01-28 17:07:37
bpp应该是每像素或像素深度的位数。 RGB图像为24。我试着检查各个位的添加/对齐,但它们似乎没有问题。我不确定如何在阅读数据后将其解析为一大块。 – Sullivan 2012-01-28 17:11:57