TGA格式编码问题详解
本文档是为满足许多对 TGA 图像格式的了解需要而创建的。本文摘录自truevision 技术指南的附录 C,如果 需要更进一步的信息,请致信以下地址: at&t electronic photography and imaging center 2002 wellesley ave. indianapolis, in 42619
本文档不求全面,但力求准确。如果你发现了任何拼写错误或内容错误,请告诉我,( david mcduffe, 75530,2626 ),我将改正这些错误,谢谢。
不全面的原因是 TGA 包含了超过六种图像文件格式,而其中的几种较为常用。 我选择了我现在使用的格式并 在本文中加以详解。 如果你需要本文中没有包含的格式说明,你可以与你的 truevision 代理商联系。
对所有的 TGA 格式的文件而言,其第三字节(二进制整数)用来区别各种不同的 TGA 文件。下面列出了该字 节表明的对应文件类型:
0 - 文件中没有图像数据
1 - 未压缩的,颜色表图像
2 - 未压缩的,rgb 图像
3 - 未压缩的,黑白图像
9 - runlength 编码的颜色表图像
10 - runlength 编码的 rgb 图像
11 - 压缩的,黑白图像
32 - 使用 huffman,delta 和 runlength 编码的颜色表图像
33 - 使用 huffman,delta 和 runlength 编码的颜色映射图像,4 趟四叉树类型处理。
本文仅仅描述对应 1,2,9 和 10 的文件格式。
-------------------------------------------------------------------------------- |数据类型 1: 颜色表(color-mapped)图像 |--------|--------|------------------------------------------------------------ | 偏移 | 长度 | 描述 |--------|--------|------------------------------------------------------------ | 0 | 1 | 图像信息字段(见本子表的后面)的字符数 | | | | | | 本字段是 1 字节无符号整型,指出了图像格式区别字段长度 | | | 其取值范围是 0 到 255 ,当它为 0 时表示没有图像的 | | | 信息字段。 | | | | | | |--------|--------|------------------------------------------------------------ | 1 | 1 | 颜色表的类型 | | | | | | 该字段为表示对应格式 1 的图像而包含一个二进制 1 | | | |--------|--------|------------------------------------------------------------ | 2 | 1 | 图像类型码 | | | | | | 该字段总为 1 , 这也是此类型为格式 1 的原因 | | | |--------|--------|------------------------------------------------------------ | 3 | 5 | 颜色表规格 | | | | 3 | 2 | 颜色表首址 | | | 颜色表首元表项的整型(低位-高位)索引 | | | | 5 | 2 | 颜色表的长度 | | | 颜色表的表项总数,整型(低位-高位) | | | | 7 | 1 | 颜色表表项的位(bit)数 | | | 16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA | | | | | | |--------|--------|------------------------------------------------------------ | 8 | 10 | 图像规格 | | | | 8 | 2 | 图像 x 坐标起始位置 | | | 图像左下角 x 坐标的整型(低位-高位)值 | | | | | | | 10 | 2 | 图像 y 坐标起始位置 | | | 图像左下角 y 坐标的整型(低位-高位)值 | | | | | | | 12 | 2 | 图像宽度 | | | 以像素为单位,图像宽度的整型(低位-高位)值 | | | | 14 | 2 | 图像高度 | | | 以像素为单位,图像高度的整型(低位-高位)值 | | | | 16 | 1 | 图像每像素存储占用位(bit)数 | | | | | | | 17 | 1 | 图像描述符字节 | | | bits 3-0 - 每像素的属性位(bit)数 | | | | | | bit 4 - 保留,必须为 0 | | | bit 5 - 屏幕起始位置标志 | | | 0 = 原点在左下角 | | | 1 = 原点在左上角 | | | truevision 图像必须为 0 | | | bits 7-6 - 交叉数据存储标志 | | | 00 = 无交叉 | | | 01 = 两路奇/偶交叉 | | | 10 = 四路交叉 | | | 11 = 保留 | | | 这一项应该设为 0,不要问我为什么 | | | |--------|--------|------------------------------------------------------------ | 18 | 可变 | 图像信息字段 | | | 包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的 | | | 值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以 | | | 含有 255 个字符。如果需要存储更多信息,可以放在图像数据 | | | 之后 | | | | | | |--------|--------|------------------------------------------------------------ | 可变 | 可变 | 颜色表数据 | | | | | | 起始位置由前一个字段的大小决定;其长度由单项数据大小 | | | 和数据项数目决定(在前面相应的说明字段中给出) | | | 每项是 2 字节,3 字节或 4 字节,字节中没有使用的位(bit) | | | 被认为是属性位。 | | | | | | 4 字节表项中,字节 1 表示 BLUE,字节 2 表示 GREEN, | | | 字节 3 表示 RED,字节 4 表示属性 | | | 3 字节表项中各字节依次对应 BLUE,GREEN,RED | | | | | | 2 字节表项中,两个字节分解成如下形式: | | | arrrrrgg gggbbbbb | | | 但是,由于低位在前,高位在后的存储顺序,从文件中读出表项 | | | 时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位。 | | | |--------|--------|------------------------------------------------------------ | 可变 | 可变 | 图像数据字段 | | | | | | 该字段给出了 (高度)x(宽度)个颜色表项索引,每个索引 | | | 以整数个字节的形式存储(典型的例子如 1 或 2 个字节) | | | 所有的数据都没有符号,对于 2-字节表项而言,低位字节是 | | | 先存储的。 | | | -------------------------------------------------------------------------------
-------------------------------------------------------------------------------- |数据类型 2: 无颜色表 rgb 图像 |--------|--------|------------------------------------------------------------ | 偏移 | 长度 | 描述 |--------|--------|---------------------------------------------------------- | 0 | 1 | 图像信息字段( 见本子表的后面 )的字符数 | | | | | | 本字段是 1 字节无符号整型,指出了图像格式区别字段长度 | | | 其取值范围是 0 到 255 ,当它为 0 时表示没有图像的 | | | 信息字段。 | | | |--------|--------|------------------------------------------------------------ | 1 | 1 | 颜色表类型 | | | | | | 该字段的内容或者为 0 或者为 1;0 表示没有颜色表,1 表示 | | | 颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略。 | | | 提示:如果置为 1(targa 绘画程序)将把边框颜色设置为映射 | | | 中的第一种颜色 | | | |--------|--------|------------------------------------------------------------ | 2 | 1 | 图像类型码 | | | | | | 该字段总为 2 , 这也是此类型为格式 2 的原因 | | | |--------|--------|------------------------------------------------------------ | 3 | 5 | 颜色表规格 | | | | | | 如果颜色表类型字段为 0 则被忽略;否则描述如下 | | | | 3 | 2 | 颜色表首址 | | | 颜色表首元入口的整型(低位-高位)索引 | | | | 5 | 2 | 颜色表的长度 | | | 颜色表的表项总数,整型(低位-高位) | | | | 7 | 1 | 颜色表表项的位(bit)数 | | | 16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA | | | | | | |--------|--------|------------------------------------------------------------ | 8 | 10 | 图像规格 | | | | 8 | 2 | 图像 x 坐标起始位置 | | | 图像左下角 x 坐标的整型(低位-高位)值 | | | | | | | 10 | 2 | 图像 y 坐标起始位置 | | | 图像左下角 y 坐标的整型(低位-高位)值 | | | | | | | 12 | 2 | 图像宽度 | | | 以像素为单位,图像宽度的整型(低位-高位)值 | | | | 14 | 2 | 图像高度 | | | 以像素为单位,图像高度的整型(低位-高位)值 | | | | 16 | 1 | 图像每像素存储占用位(bit)数 | | | 它的值为16,24 或 32 等等决定了该图像是 TGA 16,TGA24 | | | TGA 32 等等 | | | | 17 | 1 | 图像描述符字节 | | | bits 3-0 - 每像素对应的属性位的位数;对于 TGA 16, | | | 该值为 0 或 1,对于 TGA 24,该值为 0, | | | 对于 TGA 32,该值为 8 | | | | | | bit 4 - 保留,必须为 0 | | | bit 5 - 屏幕起始位置标志 | | | 0 = 原点在左下角 | | | 1 = 原点在左上角 | | | 对于 truevision 图像必须为 0 | | | bits 7-6 - 交叉数据存储标志 | | | 00 = 无交叉 | | | 01 = 两路奇/偶交叉 | | | 10 = 四路交叉 | | | 11 = 保留 | | | |--------|--------|------------------------------------------------------------ | 18 | 可变 | 图像信息字段 | | | 包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的 | | | 值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以 | | | 含有 255 个字符。如果需要存储更多信息,可以放在图像数据 | | | 之后 | | | |--------|--------|------------------------------------------------------------ | 可变 | 可变 | 颜色表数据 | | | | | | 如果颜色表类型为 0,则该域不存在,否则越过该域直接读取 | | | 图像颜色表规格中描述了每项的字节数,为 2,3,4 之一 | | | | | | | | | | | | |--------|--------|------------------------------------------------------------ | 可变 | 可变 | 图像数据域 | | | | | | 这里存储了(宽度)x(高度)个像素,每个像素中的 rgb 色值 | | | 该色值包含整数个字节 | | | | | | | | | 3 字节表项中各字节依次对应 BLUE,GREEN,RED | | | | | | 2 字节表项中,两个字节分解成如下形式: | | | arrrrrgg gggbbbbb | | | 但是,由于低位在前,高位在后的存储顺序,从文件中读出表项 | | | 时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位 | | | | | | 4 字节表项包含了分别代表 blue,green,red 及属性的四个 | | | 字节;(由于硬件上的原因)有的时候 TGA 24 类型的图像也象 | | | TGA 32 类型的图像那样存储 | | | | | | --------------------------------------------------------------------------------
-------------------------------------------------------------------------------- |数据类型 9: runlength 编码,带颜色表的图像 |--------|--------|------------------------------------------------------------ | 偏移 | 长度 | 描述 |--------|--------|------------------------------------------------------------ | 0 | 1 | 图像信息字段(见本子表的后面)的字符数 | | | | | | 本字段是 1 字节无符号整型,指出了图像格式区别字段长度 | | | 其取值范围是 0 到 255 ,当它为 0 时表示没有图像的 | | | 信息字段。 | | | |--------|--------|------------------------------------------------------------ | 1 | 1 | 颜色表的类型 | | | | | | 该字段为表示对应带颜色表的图像而总为 1 | | | |--------|--------|------------------------------------------------------------ | 2 | 1 | 图像类型码 | | | | | | 本类型该字段为二进制 9 | | | |--------|--------|------------------------------------------------------------ | 3 | 5 | 颜色表规格 | | | | | | 如果颜色表类型字段为 0 则被忽略;否则描述如下 | | | | | | | 3 | 2 | 颜色表首址 | | | 颜色表首元入口的整型(低位-高位)索引 | | | | 5 | 2 | 颜色表的长度 | | | 颜色表的表项总数,整型(低位-高位) | | | | 7 | 1 | 颜色表表项的位(bit)数 | | | 16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA | | | |--------|--------|------------------------------------------------------------ | 8 | 10 | 图像规格 | | | | 8 | 2 | 图像 x 坐标起始位置 | | | 图像左下角 x 坐标的整型(低位-高位)值 | | | | | | | 10 | 2 | 图像 y 坐标起始位置 | | | 图像左下角 y 坐标的整型(低位-高位)值 | | | | | | | 12 | 2 | 图像宽度 | | | 以像素为单位,图像宽度的整型(低位-高位)值 | | | | 14 | 2 | 图像高度 | | | 以像素为单位,图像高度的整型(低位-高位)值 | | | | 16 | 1 | 图像每像素存储占用位(bit)数 | | | | | | | 17 | 1 | 图像描述符字节 | | | bits 3-0 - 每像素的属性位(bit)数 | | | | | | bit 4 - 保留,必须为 0 | | | bit 5 - 屏幕起始位置标志 | | | 0 = 原点在左下角 | | | 1 = 原点在左上角 | | | truevision 图像必须为 0 | | | bits 7-6 - 交叉数据存储标志 | | | 00 = 无交叉 | | | 01 = 两路奇/偶交叉 | | | 10 = 四路交叉 | | | 11 = 保留 | | | |--------|--------|------------------------------------------------------------ | 18 | 可变 | 图像信息字段 | | | 包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的 | | | 值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以 | | | 含有 255 个字符。如果需要存储更多信息,可以放在图像数据 | | | 之后 | | | |--------|--------|------------------------------------------------------------ | 可变 | 可变 | 颜色表数据 | | | | | | 起始位置由前一个字段的大小决定;其长度由单项数据大小 | | | 和数据项数目决定(在前面相应的说明字段中给出) | | | 每项是 2 字节,3 字节或 4 字节,字节中没有使用的位(bit) | | | 被认为是属性位。 | | | | | | 4 字节表项中,字节 1 表示 BLUE,字节 2 表示 GREEN, | | | 字节 3 表示 RED,字节 4 表示属性 | | | 3 字节表项中各字节依次对应 BLUE,GREEN,RED | | | | | | 2 字节表项中,两个字节分解成如下形式: | | | arrrrrgg gggbbbbb | | | 但是,由于低位在前,高位在后的存储顺序,从文件中读出表项 | | | 时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位。 | | | |--------|--------|------------------------------------------------------------ | 可变 | 可变 | 图像数据域 | | | | | | 本区域给出了(宽度)x(高度)个颜色表索引这些索引存放 | | | 在数据包中;有两中类型的数据包:run-length 数据包, | | | 以及未加工的数据包,每种类型的数据包含有 1-字节的头信息, | | | (其中指出了数据包类型和数目),其后是可变长度的数据域 | | | 头信息中最高位为 1 表示 run-length 类型的数据包,当 | | | 它为 0 时,表示未加工的数据包 | | | | | | 对于 run-length 数据包,头信息含义如下 | | | __________________________________________________ | | | | 1 bit | 7 位的重复记数减一 | | | | id | 由于 7 位表示的最大值为 127,故最大 | | | | | | 的运行大小为 128,(译注:原文为 | | | | | | the largest run size) | | | | |-------|----------------------------------------| | | | | 1 | c c c c c c c | | | | -------------------------------------------------- | | | | | | 对于未加工数据包,头信息的含义如下 | | | __________________________________________________ | | | | 1 bit | 7 位的像素个数减一 | | | | | id | 由于 7 位表示的最大值为 127,故该 | | | | | | 类型的一个数据包中像素个数不能大于 | | | | | | 128 | | | | |-------|----------------------------------------| | | | | 0 | n n n n n n n | | | | -------------------------------------------------- | | | | | | 对于 run-length 数据包而言,头信息之后是一个简单的 | | | 颜色索引,且假定该索引被重复头信息中低 7 位表示的次数 | | | run-length 数据包也许会跨越扫描线 | | | (扫描线起始于某行结束于下一行) | | | | | | 对于未加工的数据包,头信息之后是颜色索引(数值由头信息 | | | 给出)该类型的数据包也可能跨越扫描线 | | | --------------------------------------------------------------------------------
-------------------------------------------------------------------------------- |数据类型 10:run length 编码,rgb 图像 |--------|--------|------------------------------------------------------------ | 偏移 | 长度 | 描述 |--------|--------|------------------------------------------------------------ | 0 | 1 | 图像信息字段(见本子表的后面)的字符数 | | | | | | 本字段是 1 字节无符号整型,指出了图像格式区别字段长度 | | | 其取值范围是 0 到 255 ,当它为 0 时表示没有图像的 | | | 信息字段。 | | | |--------|--------|------------------------------------------------------------ | 1 | 1 | 该字段的内容或者为 0 或者为 1;0 表示没有颜色表,1 表示 | | | 颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略。 | | | 提示:如果置为 1(targa 绘画程序)将把边框颜色设置为映射 | | | 中的第一种颜色 | | | |--------|--------|------------------------------------------------------------ | 2 | 1 | 图像类型代码 | | | | | | 本类型该字段为二进制 10 | | | |--------|--------|------------------------------------------------------------ | 3 | 5 | 颜色表规格 | | | | | | 如果颜色表类型字段为 0 则被忽略;否则描述如下 | | | | | | | 3 | 2 | 颜色表首址 | | | 颜色表首元入口的整型(低位-高位)索引 | | | | 5 | 2 | 颜色表的长度 | | | 颜色表的表项总数,整型(低位-高位) | | | | 7 | 1 | 颜色表表项的位(bit)数 | | | 16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA | | | |--------|--------|------------------------------------------------------------ | 8 | 10 | 图像规格 | | | | 8 | 2 | 图像 x 坐标起始位置 | | | 图像左下角 x 坐标的整型(低位-高位)值 | | | | | | | 10 | 2 | 图像 y 坐标起始位置 | | | 图像左下角 y 坐标的整型(低位-高位)值 | | | | | | | 12 | 2 | 图像宽度 | | | 以像素为单位,图像宽度的整型(低位-高位)值 | | | | 14 | 2 | 图像高度 | | | 以像素为单位,图像高度的整型(低位-高位)值 | | | | 16 | 1 | 图像每像素存储占用位(bit)数 | | | | | | | 17 | 1 | 图像描述符字节 | | | bits 3-0 - 每像素的属性位(bit)数 | | | | | | bit 4 - 保留,必须为 0 | | | bit 5 - 屏幕起始位置标志 | | | 0 = 原点在左下角 | | | 1 = 原点在左上角 | | | truevision 图像必须为 0 | | | bits 7-6 - 交叉数据存储标志 | | | 00 = 无交叉 | | | 01 = 两路奇/偶交叉 | | | 10 = 四路交叉 | | | 11 = 保留 | | | |--------|--------|------------------------------------------------------------ | 18 | 可变 | 图像信息字段 | | | 包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的 | | | 值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以 | | | 含有 255 个字符。如果需要存储更多信息,可以放在图像数据 | | | 之后 | | | |--------|--------|------------------------------------------------------------ | 可变 | 可变 | 颜色表数据 | | | | | | 如果颜色表类型为 0,则该域不存在,否则越过该域直接读取 | | | 图像颜色表规格中描述了每项的字节数,为 2,3,4 之一 | | | |--------|--------|------------------------------------------------------------ | 可变 | 可变 | 图像数据域 | | | | | | 本区域给出了(宽度)x(高度)个颜色表索引这些索引存放 | | | 在数据包中;有两中类型的数据包:run-length 数据包, | | | 以及未加工的数据包,每种类型的数据包含有 1-字节的头信息, | | | (其中指出了数据包类型和数目),其后是可变长度的数据域 | | | 头信息中最高位为 1 表示 run-length 类型的数据包,当 | | | 它为 0 时,表示未加工的数据包 | | | | | | 对于 run-length 数据包,头信息含义如下 | | | __________________________________________________ | | | | 1 bit | 7 位的重复记数减一 | | | | id | 由于 7 位表示的最大值为 127,故最大 | | | | | | 的运行大小为 128,(译注:原文为 | | | | | | the largest run size) | | | | |-------|----------------------------------------| | | | | 1 | c c c c c c c | | | | -------------------------------------------------- | | | | | | 对于未加工数据包,头信息的含义如下 | | | __________________________________________________ | | | | 1 bit | 7 位的像素个数减一 | | | | | id | 由于 7 位表示的最大值为 127,故该 | | | | | | 类型的一个数据包中像素个数不能大于 | | | | | | 128 | | | | |-------|----------------------------------------| | | | | 0 | n n n n n n n | | | | -------------------------------------------------- | | | | | | | | | 对于 run length 数据包,头信息之后是一个简单颜色值, | | | 且假定该值重复的次数为头信息中记录的数 | | | run-length 数据包也许会跨越扫描线 | | | (扫描线起始于某行结束于下一行) | | | | | | 对于未加工数据包,头信息之后是颜色值(数目由头信息指出) | | | | | | | | | 颜色表项自身有 2-字节,3-字节或 4-字节几种大小(分别 | | | 对应 TGA 16,TGA 24 和 TGA 32)形式如下: | | | | | | | | | 3 字节表项中各字节依次对应 BLUE,GREEN,RED | | | | | | 2 字节表项中,两个字节分解成如下形式: | | | arrrrrgg gggbbbbb | | | 但是,由于低位在前,高位在后的存储顺序,从文件中读出表项 | | | 时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位 | | | | | | 4 字节表项包含了分别代表 blue,green,red 及属性的四个 | | | 字节;(由于硬件上的原因)有的时候 TGA 24 类型的图像也象 | | | TGA 32 类型的图像那样存储 | | | --------------------------------------------------------------------------------
以上内容转自:http://dev.gameres.com/Program/Visual/Other/TGAFormat.htm
bool LoadTGA(TextureImage *texture, char *filename) // Loads A TGA File Into Memory { GLubyte TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0}; // Uncompressed TGA Header GLubyte TGAcompare[12]; // Used To Compare TGA Header GLubyte header[6]; // First 6 Useful Bytes From The Header GLuint bytesPerPixel; // Holds Number Of Bytes Per Pixel Used In The TGA File GLuint imageSize; // Used To Store The Image Size When Setting Aside Ram GLuint temp; // Temporary Variable GLuint type=GL_RGBA; // Set The Default GL Mode To RBGA (32 BPP) FILE *file = fopen(filename, "rb"); // Open The TGA File if( file==NULL || // Does File Even Exist? fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) || // Are There 12 Bytes To Read? memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0 || // Does The Header Match What We Want? fread(header,1,sizeof(header),file)!=sizeof(header)) // If So Read Next 6 Header Bytes { if (file == NULL) // Did The File Even Exist? *Added Jim Strong* return FALSE; // Return False else // Otherwise { fclose(file); // If Anything Failed, Close The File return FALSE; // Return False } } texture->width = header[1] * 256 + header[0]; // Determine The TGA Width (highbyte*256+lowbyte) texture->height = header[3] * 256 + header[2]; // Determine The TGA Height (highbyte*256+lowbyte) if( texture->width <=0 || // Is The Width Less Than Or Equal To Zero texture->height <=0 || // Is The Height Less Than Or Equal To Zero (header[4]!=24 && header[4]!=32)) // Is The TGA 24 or 32 Bit? { fclose(file); // If Anything Failed, Close The File return FALSE; // Return False } texture->bpp = header[4]; // Grab The TGA's Bits Per Pixel (24 or 32) bytesPerPixel = texture->bpp/8; // Divide By 8 To Get The Bytes Per Pixel imageSize = texture->width*texture->height*bytesPerPixel; // Calculate The Memory Required For The TGA Data texture->imageData=(GLubyte *)malloc(imageSize); // Reserve Memory To Hold The TGA Data if( texture->imageData==NULL || // Does The Storage Memory Exist? fread(texture->imageData, 1, imageSize, file)!=imageSize) // Does The Image Size Match The Memory Reserved? { if(texture->imageData!=NULL) // Was Image Data Loaded free(texture->imageData); // If So, Release The Image Data fclose(file); // Close The File return FALSE; // Return False } for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel) // Loop Through The Image Data { // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue) temp=texture->imageData[i]; // Temporarily Store The Value At Image Data 'i' texture->imageData[i] = texture->imageData[i + 2]; // Set The 1st Byte To The Value Of The 3rd Byte texture->imageData[i + 2] = temp; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value) } fclose (file); // Close The File // Build A Texture From The Data glGenTextures(1, &texture[0].texID); // Generate OpenGL texture IDs glBindTexture(GL_TEXTURE_2D, texture[0].texID); // Bind Our Texture glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Filtered glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Linear Filtered if (texture[0].bpp==24) // Was The TGA 24 Bits { type=GL_RGB; // If So Set The 'type' To GL_RGB } glTexImage2D(GL_TEXTURE_2D, 0, type, texture[0].width, texture[0].height, 0, type, GL_UNSIGNED_BYTE, texture[0].imageData); return true; // Texture Building Went Ok, Return True }
posted on 2014-06-04 09:35 NewPanderKing 阅读(942) 评论(0) 编辑 收藏 举报