TGA格式图像是游戏中十分常见的一种图像格式,所以有必要了解其内部格式以及编程实现。
TGA图像一般有非压缩和压缩两种格式,下面分别进行介绍。
一、非压缩TGA图像
注:前面的标记绿色的部分(共12字节)表示对于所有的非压缩TGA格式图像值都是相同的!所以通常用来在读取数据时鉴别是否为TGA图像。
名称
|
偏移
|
长度
|
说明
|
图像信息字段长度
|
0
|
1
|
本字段是1字节无符号整型,指出图像信息字段(见本子表的后面)长度,其取值范围是0到255,当它为0时表示没有图像的信息字段。
|
颜色表类型
|
1
|
1
|
0表示没有颜色表,1表示颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略。
|
图像类型码
|
2
|
1
|
该字段总为2,这也是此类型为格式2的原因。
|
颜色表规格字段
|
颜色表首址
|
3
|
2
|
颜色表首的入口索引,整型(低位-高位)
|
如果颜色表字段为0,则忽略该字段
|
颜色表的长度
|
5
|
2
|
颜色表的表项总数,整型(低位-高位)
|
颜色表项位数
|
7
|
1
|
位数(bit),16代表16位TGA,24代表24位TGA,32代表32位TGA
|
图像规格字段
|
图像X坐标起始位置
|
8
|
2
|
图像左下角X坐标的整型(低位-高位)值
|
图像Y坐标起始位置
|
10
|
2
|
图像左下角Y坐标的整型(低位-高位)值
|
图像宽度
|
12
|
2
|
以像素为单位,图像宽度的整型(低位-高位)
|
图像高度
|
14
|
2
|
以像素为单位,图像宽度的整型(低位-高位)
|
图像每像素存储占用位数
|
16
|
1
|
它的值为16,24或32等等。决定了该图像是TGA
16,TGA24,TGA 32等等。
|
图像描述符字节
|
17
|
1
|
bits 3-0 -每像素对应的属性位的位数;
对于TGA 16,该值为0或1,对于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,则该域不存在,否则越过该域直接读取图像颜色表规格中描述了每项的字节数,为2,3,4之一。
|
图像数据
|
可变
|
可变
|
RGB颜色数据,存放顺序为:BGR(A)
|
下面的程序实现了绘制一个立方体,并进行纹理贴图。
需要注意的是:TGA图像中数据存放的顺序是BGR(A),而在OpenGL中顺序是RGB(A),所以在进行纹理生成的时候必须先进行格式的转化。
在OpenGL中只能加载24位或者32位的TGA图像生成纹理。
TGATexture.h定义了一些结构体以及函数声明:
TGATexture.cpp则包含加载TGA图像生成纹理的函数具体实现:
main.cpp主程序:
运行结果:
二、压缩TGA图像
其格式如下表:
名称
|
偏移
|
长度
|
说明
|
图像信息字段长度
|
0
|
1
|
本字段是1字节无符号整型,指出图像信息字段(见本子表的后面)长度,其取值范围是0到255,当它为0时表示没有图像的信息字段。
|
颜色表类型
|
1
|
1
|
0表示没有颜色表,1表示颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略。
|
图像类型码
|
2
|
1
|
该字段总为10,这也是此类型为格式10的原因。
|
颜色表规格字段
|
颜色表首址
|
3
|
2
|
颜色表首的入口索引,整型(低位-高位)
|
如果颜色表字段为0,则忽略该字段
|
颜色表的长度
|
5
|
2
|
颜色表的表项总数,整型(低位-高位)
|
颜色表项位数
|
7
|
1
|
位数(bit),16代表16位TGA,24代表24位TGA,32代表32位TGA
|
图像规格字段
|
图像X坐标起始位置
|
8
|
2
|
图像左下角X坐标的整型(低位-高位)值
|
图像Y坐标起始位置
|
10
|
2
|
图像左下角Y坐标的整型(低位-高位)值
|
图像宽度
|
12
|
2
|
以像素为单位,图像宽度的整型(低位-高位)
|
图像高度
|
14
|
2
|
以像素为单位,图像宽度的整型(低位-高位)
|
图像每像素存储占用位数
|
16
|
1
|
它的值为16,24或32等等。决定了该图像是TGA
16,TGA24,TGA 32等等。
|
图像描述符字节
|
17
|
1
|
bits 3-0 -每像素对应的属性位的位数;
对于TGA 16,该值为0或1,对于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,则该域不存在,否则越过该域直接读取图像颜色表规格中描述了每项的字节数,为2,3,4之一。
|
图像数据
|
可变
|
可变
|
采用RLE压缩后的RGB颜色数据。
|
Tga的压缩算法采用了RLE算法,RLE算法的基本思想是将数据分为两大类:
A:连续的不重复字节
B:连续的重复字节
RLE算法应用于RGB格式的图片压缩中,则把数据分为:
A:连续的不重复像素颜色值
B:连续的重复像素颜色值
然后将数据按这两类数据分成若干长度不相等数据块,每个数据块的开始都是一个1个字节长度的header(RLE在纯数据压缩中header位2个字节16位),后面紧跟着data数据块,如下。
每个header的第一位作为标记:0表示A类颜色数据,1表示B类颜色数据。剩下的7位意义如下:
对于A类数据:表示data有多少个像素的RGB颜色值。取值0-127,0表示1个像素,所以最多为128个像素,data块则为这些不重复的像素RGB颜色值。
对于B类数据:表示有多少个像素具有相同的RGB颜色值。取值0-127,0表示1个像素,所以最多为128个像素,data仅包含一个像素的颜色值,即为重复的那个颜色值。
读取其像素数据部分需要注意一下,需要分情况讨论看是A类数据还是B类数据:
分享到:
相关推荐
opengl游戏编程合集,从基础高高级。还有编程的实例,游戏爱好者不要错过了啊
1-13章全部源码
Opengl游戏编程 pdf 应该是完整的 额 没分了 发这个出来赚点
OpenGL游戏编程入门经典辅导书籍 OpenGL游戏编程入门经典辅导书籍
OPENGL游戏编程_徐明亮++卢红星++王琬编著,论坛里其它的相关资源大部分不全。这是我在网上买的,保证完整,文件较大,分成两部分,请分别下载。
网上看到的很全面,openGL 游戏编程。大家一起学习共同进步
opengl游戏编程小试.pdf opengl游戏编程小试.pdf
基于Qt+OpenGL 实现的3D模型obj文件加载以及纹理贴图,未使用第三方库,根据obj文件的格式,逐行解析并读取,加载到顶点缓冲区中,适合学习OBJ模型加载的同学参考。
OpenGL游戏编程:3D三连棋源码..rar
每一个都是在前一个的基础上进行开发 OpenGL学习3D游戏编程,OpenGl游戏框架、基本图形、组合图形、显示文字、显示3D模型、MDL、MD2动画模型、射击爆炸、碰撞检测、游戏进度保存、摄影漫游
10多个由浅入深介绍OpenGL游戏编程的VC代码。
opengl 游戏编程 第十章opengl 游戏编程 第十章
<<OpenGL编程技术详解>>书中的所有示例程序,学习与练习过程中按照书中示例编写,VS.NET直接通过编译,与大家共享资源,如果大家有更好的建议或编程技巧等希望也与我共享,共同进步
也是网上找的一本书,本来想不要积分的分享的,没想到,还是需要积分,如果没有积分,有需要的朋友可以发邮件给我karaysn@163.com
opengl 游戏编程 第八章opengl 游戏编程 第八章
关于Opengl游戏编程的代码实现,非常有用,具体介绍了Opengl基于SDK的应用程序框架和实现图形描绘的细节!