|
|
TGA的文件头:
struct TGAHeader
{
varu8 idLength_; // 描述长度
varu8 colormapType_; // 等于0的时候没有colormap
varu8 imageType_; // 等于2的时候为未压缩的RGB数据
struct ColormapInfo
{
varu16 offset_; // 偏移
varu16 length_; // 长度
varu8 bpp_; // 色深
}colormapInfo_;
struct ImageInfo
{
varu16 xOrigin_; // x原点
varu16 yOrigin_; // y原点
varu16 width_; // 图片宽
varu16 height_; // 图片高
varu8 bpp_; // 图片色深
varu8 descriptor_; // !疑惑的描述子
}imageInfo_;
};
我在OpenGL里导入imageType_ = 2的TGA图片做为纹理,发现同样是32位的图片,当descriptor_ & 0xF == 8(资料上说是每像素对应的属性位的位数,对于 TGA 24,该值为 0,对于 TGA 32,该值为 8,图片来自Nehe opengl 24课教程)的时候图片显示正常,但是如果descriptor_ & 0xF == 0(图片由wowmodelview-0.48e导出),那么就只有图片的最下面一小部分正常显示。
处理过程:
fs.read((char*)&header, sizeof(TGAHeader)); // 读头结构
fs.seekg(header.idLength_, ios_base::cur); // 跳过描述
fs.seekg(header.colormapInfo_.length_, ios_base::cur); // 跳过colormap
varu bytePerPixel = header.imageInfo_.bpp_ / 8; // 这里都是4
varu size = header.imageInfo_.width_ * header.imageInfo_.height_ * bytePerPixel; // 256 * 268 * 4
image.data_ = new byte[size];
fs.read((char*)image.data_, size); // 读像素
for (varu i=0; i<size; i+=bytePerPixel)
std::swap(image.data_, image.data_[i+2]); // 交换R和B
// 纹理映射
if (header.imageInfo_.bpp_ == 24)
{
::glTexImage2D(GL_TEXTURE_2D, 0, 3, width_, height_, 0, GL_RGB, GL_UNSIGNED_BYTE, image.data_);
}
else if (header.imageInfo_.bpp_ == 32)
{
::glTexImage2D(GL_TEXTURE_2D, 0, 4, width_, height_, 0, GL_RGBA, GL_UNSIGNED_BYTE, image.data_);
}
卡在这里2天了 :-( |
-
|