`
mmdev
  • 浏览: 12957363 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

【OpenGL】游戏编程常用TGA图像格式详解以及加载纹理编程实现

 
阅读更多

TGA格式图像是游戏中十分常见的一种图像格式,所以有必要了解其内部格式以及编程实现。

TGA图像一般有非压缩和压缩两种格式,下面分别进行介绍。

一、非压缩TGA图像

注:前面的标记绿色的部分(共12字节)表示对于所有的非压缩TGA格式图像值都是相同的!所以通常用来在读取数据时鉴别是否为TGA图像。

名称

偏移

长度

说明

图像信息字段长度

0

1

本字段是1字节无符号整型,指出图像信息字段(见本子表的后面)长度,其取值范围是0255,当它0时表示没有图像的信息字段

颜色表类型

1

1

0表示没有颜色表,1表示颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略。

图像类型码

2

1

该字段总为2这也是此类型为格式2的原因。

颜色表规格字段

颜色表首址

3

2

颜色表首的入口索引,整型(低位-高位)

如果颜色表字段为0,则忽略该字段

颜色表的长度

5

2

颜色表的表项总数,整型(低位-高位)

颜色表项位数

7

1

位数(bit),16代表16TGA24代表24TGA32代表32TGA

图像规格字段

图像X坐标起始位置

8

2

图像左下角X坐标的整型(低位-高位)值

图像Y坐标起始位置

10

2

图像左下角Y坐标的整型(低位-高位)值

图像宽度

12

2

以像素为单位,图像宽度的整型(低位-高位)

图像高度

14

2

以像素为单位,图像宽度的整型(低位-高位)

图像每像素存储占用位数

16

1

它的值为162432等等。决定了该图像是TGA 16TGA24,TGA 32等等。

图像描述符字节

17

1

bits 3-0 -每像素对应的属性位的位数;

对于TGA 16该值为01,对于TGA24,该值为0,对于TGA 32,该值为8

bit 4-保留,必须为0

bit 5-屏幕起始位置标志

0 =原点在左下角

1 =原点在左上角

对于truevision图像必须为0

bits 7-6 -交叉数据存储标志

00 =无交叉

01 =两路奇/偶交叉

10 =四路交叉

11 =保留(一般这个字节设为0x00即可)

图像信息字段

18

可变

包含一个自由格式的,长度是图像由“图像信息字段”指定。它常常被忽略(即偏移0处值为0),注意其最大可以含有255个字符。如果需要存储更多信息,可以放在图像数据之后。

颜色表数据

可变

可变

如果颜色表类型为0,则该域不存在,否则越过该域直接读取图像颜色表规格中描述了每项的字节数,为234之一。

图像数据

可变

可变

RGB颜色数据,存放顺序为:BGR(A)


下面的程序实现了绘制一个立方体,并进行纹理贴图。

需要注意的是:TGA图像中数据存放的顺序是BGR(A),而在OpenGL中顺序是RGB(A),所以在进行纹理生成的时候必须先进行格式的转化。

在OpenGL中只能加载24位或者32位的TGA图像生成纹理。

TGATexture.h定义了一些结构体以及函数声明:

TGATexture.cpp则包含加载TGA图像生成纹理的函数具体实现:

main.cpp主程序:

运行结果:




二、压缩TGA图像

其格式如下表:


名称

偏移

长度

说明

图像信息字段长度

0

1

本字段是1字节无符号整型,指出图像信息字段(见本子表的后面)长度,其取值范围是0255,当它为0时表示没有图像的信息字段。

颜色表类型

1

1

0表示没有颜色表,1表示颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略。

图像类型码

2

1

该字段总为10这也是此类型为格式10的原因。

颜色表规格字段

颜色表首址

3

2

颜色表首的入口索引,整型(低位-高位)

如果颜色表字段为0,则忽略该字段

颜色表的长度

5

2

颜色表的表项总数,整型(低位-高位)

颜色表项位数

7

1

位数(bit),16代表16TGA24代表24TGA32代表32TGA

图像规格字段

图像X坐标起始位置

8

2

图像左下角X坐标的整型(低位-高位)值

图像Y坐标起始位置

10

2

图像左下角Y坐标的整型(低位-高位)值

图像宽度

12

2

以像素为单位,图像宽度的整型(低位-高位)

图像高度

14

2

以像素为单位,图像宽度的整型(低位-高位)

图像每像素存储占用位数

16

1

它的值为162432等等。决定了该图像是TGA 16TGA24,TGA 32等等。

图像描述符字节

17

1

bits 3-0 -每像素对应的属性位的位数;

对于TGA 16该值为01,对于TGA24,该值为0,对于TGA 32,该值为8

bit 4-保留,必须为0

bit 5-屏幕起始位置标志

0 =原点在左下角

1 =原点在左上角

对于truevision图像必须为0

bits 7-6 -交叉数据存储标志

00 =无交叉

01 =两路奇/偶交叉

10 =四路交叉

11 =保留

图像信息字段

18

可变

包含一个自由格式的,长度是图像由“图像信息字段”指定。它常常被忽略(即偏移0处值为0),注意其最大可以含有255个字符。如果需要存储更多信息,可以放在图像数据之后。

颜色表数据

可变

可变

如果颜色表类型为0,则该域不存在,否则越过该域直接读取图像颜色表规格中描述了每项的字节数,为234之一。

图像数据

可变

可变

采用RLE压缩后的RGB颜色数据。

Tga的压缩算法采用了RLE算法,RLE算法的基本思想是将数据分为两大类:

A:连续的不重复字节

B:连续的重复字节

RLE算法应用于RGB格式的图片压缩中,则把数据分为:

A:连续的不重复像素颜色值

B:连续的重复像素颜色值

然后将数据按这两类数据分成若干长度不相等数据块,每个数据块的开始都是一个1个字节长度的headerRLE在纯数据压缩中header2个字节16位),后面紧跟着data数据块,如下。

Header1个字节)

Data(变长)

每个header的第一位作为标记:0表示A类颜色数据,1表示B类颜色数据。剩下的7位意义如下:

对于A类数据:表示data有多少个像素的RGB颜色值。取值0-1270表示1个像素,所以最多为128个像素,data块则为这些不重复的像素RGB颜色值。

对于B类数据:表示有多少个像素具有相同的RGB颜色值。取值0-1270表示1个像素,所以最多为128个像素,data仅包含一个像素的颜色值,即为重复的那个颜色值。


读取其像素数据部分需要注意一下,需要分情况讨论看是A类数据还是B类数据:



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics