游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2888|回复: 4

求助:TGA格式的疑惑

[复制链接]

3

主题

35

帖子

35

积分

注册会员

Rank: 2

积分
35
QQ
发表于 2007-4-11 11:43:00 | 显示全部楼层 |阅读模式
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天了 :-(
sf_2007411114249.gif

8

主题

390

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-4-11 12:48:00 | 显示全部楼层

Re:求助:TGA格式的疑惑

还有就是rle压缩的问题,wowmodelview到出的应该是未压缩32bits的,你可以看看wowmodelview的代码

3

主题

35

帖子

35

积分

注册会员

Rank: 2

积分
35
QQ
 楼主| 发表于 2007-4-11 13:15:00 | 显示全部楼层

Re:求助:TGA格式的疑惑

谢谢。
RLE RGB格式的应该是imageType_ == 10,这里是2,也就是未压缩,我也正是这么处理的,可是结果不正确。最奇怪的是,显示不是乱的,下面一小部分能正常显示,上面却全是灰色。

3

主题

35

帖子

35

积分

注册会员

Rank: 2

积分
35
QQ
 楼主| 发表于 2007-4-12 10:59:00 | 显示全部楼层

Re: 求助:TGA格式的疑惑

刚刚把读到的数据log下来了,同样非常奇怪:

// format: RGBA - offset

// 最开始一段貌似正常,然后我发现图片最上面有几行的确是正常的 只是太少了 不明显 昨天被忽略了 - -||| 刚开始alpha都是255

231 185 148 255 - 0
231 185 148 255 - 4
231 185 148 255 - 8
226 180 138 255 - 12
219 177 136 255 - 16
217 172 132 255 - 20
...
127 79 35 255 - 1328
139 80 40 255 - 1332
152 71 35 255 - 1336
105 255 197 150 - 1340 - 从这里开始alpha变化起来,不过也许还是正常的
92 255 197 146 - 1344
92 255 194 146 - 1348
92 255 194 146 - 1352
156 255 194 194 - 1356
155 255 243 193 - 1360
155 255 234 193 - 1364
155 255 234 193 - 1368
155 255 235 193 - 1372
...
148 255 251 177 - 1632
0 255 203 20 - 1636
205 255 75 205 - 1640
205 205 205 205 - 1644 - 这里~!@#$%^&*,从这里开始后面到尾数据都是这样 难怪是灰色的
205 205 205 205 - 1648
205 205 205 205 - 1652
205 205 205 205 - 1656
205 205 205 205 - 1660
205 205 205 205 - 1664
...
205 205 205 205 - 262116
205 205 205 205 - 262120
205 205 205 205 - 262124
205 205 205 205 - 262128
205 205 205 205 - 262132
205 205 205 205 - 262136
205 205 205 205 - 262140 - 最后一个像素,还是这样?!

从offset = 1644开始,后面都是205 205 205 205,问题是显示结果是一头一尾正常呀?那么末尾的数据怎么是错的也正常显示? [em7]这是第3天了  [em4]

3

主题

35

帖子

35

积分

注册会员

Rank: 2

积分
35
QQ
 楼主| 发表于 2007-4-12 12:05:00 | 显示全部楼层

Re: 求助:TGA格式的疑惑

[em10]

跟了半天,才发现打开文件的时候忘记用binary模式了 低级错误 太不应该了 - -|||
默认参数习惯了,思维惯性 =。=

问题已解决 汗一个……

给大家带来麻烦了 抱歉!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 19:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表