Part 10 使用TGA文件作为纹理

原创 2007年10月10日 12:59:00
        TGA文件用作纹理较BMP文件的优势在于:TGA文件的载入不需要使用aux库,并且TGA纹理可以拥有ALPHA通道。而载入TGA文件作为纹理必须要了解的是TGA文件的文件结构。TGA文件的文件结构如下面的表所示
偏移
长度
描述
32位常用图像文件各个字节的值
0
1
指出图像信息字段的长度,其取值范围是 0 到 255 ,当它为 0 时表示没有图像的信息字段。
0
1
1
是否使用颜色表,0 表示没有颜色表,1 表示颜色表存在
0
2
1
该字段总为 2。图像类型码,tga一共有6种格式,2表示无颜色表 rgb 图像
2
3
5
颜色表规格,总为0。
0
4
0
5
0
6
0
7
0
8       10           图像规格说明 开始
8
2
图像 x 坐标起始位置,一般为0
0
9
10
2
图像 y 坐标起始位置,一般为0
0
11
12
2
图像宽度,以像素为单位
256
13
14
2
图像高度,以像素为单位
256
15
16
1
图像每像素存储占用位(bit)数
32
17
1
图像描述符字节
bits 3-0 - 每像素对应的属性位的位数,对于 TGA 24,该值为 0
bit 4 - 保留,必须为 0
bit 5 - 屏幕起始位置标志,0 = 原点在左下角,1 = 原点在左上角
一般这个字节设为0x00即可
00100000(2)
18
可变
图像数据域
这里存储了(宽度)x(高度)个像素,每个像素中的 rgb 色值该色值包含整数个字节
...
       在读入TGA文件时最重要的是对TGA文件的文件头信息的分析。我们可以看到TGA文件的前12个字节可以作为TGA文件的特征来使用,如果读取的一个文件前12个字节为0,0,2,0...那么我们可以判断这个文件确实是一个TGA文件。而总共18个字节的后6个字节提供了TGA文件的包括宽、高、每个位所包含的位数等等的信息,在确信是TGA文件并且读取这个文件以后我们需要从这个部分提取关于这个TGA文件的这些信息,然后根据这些信息构件一个TGA文件的结构,这个结构的通用样式如下所示。
struct Texture
...{
    GLuint ImageSize;
    GLuint BitPerPixel;
    GLuint Width;
    GLuint Height;
    GLubyte 
*Data;
}
;

        当我们将TGA文件载入到内存以后,我们象一般的纹理一样进行处理,申明纹理句柄,绑定以后利用glTexImage2D来加载,之后在我们的渲染阶段进行绑定以后指定纹理坐标,然后进行一般步骤的渲染。
       下面是一个载入TGA文件的函数。 
bool LoadTexture(const char * filename)
...{
    
if (!filename)
        
return false;
    FILE 
*file = fopen(filename,"r");
    
if (file)
    
...{
        GLubyte fileheader[
12];
        GLubyte Compare[
12= ...{0,0,2,0};
        GLubyte info[
6];
        
if (fread(fileheader,1,12,file) != 12 || memcmp(fileheader,Compare,sizeof (Compare)))
            
return false;
        
if (fread(info,1,6,file) != 6)
            
return false;
        Texture tex;
        tex.Width 
= 256 * info[1+ info[0];
        tex.Height 
= 256 * info[3+ info[2];
        tex.BitPerPixel 
= info[4];
        GLuint type;
        
if (tex.BitPerPixel == 24)
            type 
= GL_RGB;
        
else
            type 
= GL_RGBA;
        tex.ImageSize 
= tex.Width * tex.Height * tex.BitPerPixel / 8;
        tex.Data 
= new GLubyte[tex.ImageSize];
        
if (fread(tex.Data,1,tex.ImageSize,file) != tex.ImageSize)
        
...{
            fclose(file);
            delete[] tex.Data;
            
return false;
        }

        fclose(file);
        
for (int i = 0;i < (int) tex.ImageSize;i++)
        
...{
            GLubyte temp 
= tex.Data[i];
            tex.Data[i] 
= tex.Data[i + 2];
            tex.Data[i 
+ 2= temp;
        }


        glGenTextures(
1,&TexHandle);
        glBindTexture(GL_TEXTURE_2D,TexHandle);
        glTexImage2D(GL_TEXTURE_2D,
0,type,tex.Width,tex.Height,0,type,GL_UNSIGNED_BYTE,tex.Data);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        
if (tex.Data)
            free(tex.Data);
        
return true;
    }

    
return false;
}

使用TGA文件作为纹理(转 Phil.Z)

TGA文件用作纹理较BMP文件的优势在于:TGA文件的载入不需要使用aux库,并且TGA纹理可以拥有ALPHA通道。而载入TGA文件作为纹理必须要了解的是TGA文件的文件结构。TGA文件的文件结构如下...
  • Crazyjumper
  • Crazyjumper
  • 2007-10-19 20:53:00
  • 2833

OpenGL贴图(soil)使用方法

  • 2015年11月19日 22:30
  • 468KB
  • 下载

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

TGA格式图像是游戏中十分常见的一种图像格式,所以有必要了解其内部格式以及编程实现。 TGA图像一般有非压缩和压缩两种格式,下面分别进行介绍。 一、非压缩TGA图像 注:前面的标记绿色的...
  • xiajun07061225
  • xiajun07061225
  • 2012-06-08 20:23:19
  • 8765

利用opencv读取图片将其作为opengl的纹理图片的实现方法

在opengl中实现三维物体的纹理贴图的第一步就是要读入图片,然后指定该图片为纹理图片。我最早接手的项目中是通过一个专门的读取bmp图片的函数来实现纹理图片的读取的。这个函数有三个缺点: 1、只能读...
  • qq_26499769
  • qq_26499769
  • 2016-08-01 18:39:03
  • 843

读《H.264_mpeg-4_part_10_white_paper》后感

花了大概两个星期左右的时间把《H.264_mpeg-4_part_10_white_paper》读了一遍,英文和中文穿插起来阅读的,英文看不懂的地方看看中文,有的地方看了中文还是不明白,而且那个中文翻...
  • xiaohaijiejie
  • xiaohaijiejie
  • 2014-12-04 16:20:16
  • 1032

DirectX11 把纹理作为材质

把纹理作为材质1. 将纹理整合到我们的材质/光照系统?要将纹理整合到我们的材质/光照系统中,通常可以将环境光和漫反射光项调制到纹理颜色上,但不需要包括高光项(这常常被称为“后期添加调制,modulat...
  • sinat_24229853
  • sinat_24229853
  • 2015-10-03 20:51:35
  • 876

H.264/MPEG-4 Part 10 White Paper 翻译(1)--概述

H.264综述   1.    引言 数字电视和DVD-video的出现使得广播电视和家庭娱乐发生了彻底的变革.随着视频压缩技术的标准化,越来越多的这些应用成为可能.MPGE系列的下一个标准,M...
  • ai552368625
  • ai552368625
  • 2015-02-01 21:23:17
  • 1055

Tga文件查看软件

  • 2016年09月19日 09:46
  • 2.28MB
  • 下载

tga文件解析

Tga常见的格式有非压缩RGB和压缩RGB两种格式,文件的第三个Byte位作为标记:2为非压缩RGB格式,10为压缩RGB格式。这里的类只实现读取非压缩格式的tga文件。先给出tga文件的文件格式:名...
  • guanghua2009
  • guanghua2009
  • 2011-07-28 17:25:01
  • 3315

构造类型之结构体

typedef关键字用于给已有的数据类型指定一个新的名称。实际上,typedef创建一个同义词,例如typedef int integer;将integer作为int的同义词,你就可以如下定义整形变量...
  • Andrew659
  • Andrew659
  • 2010-02-22 21:59:00
  • 588
收藏助手
不良信息举报
您举报文章:Part 10 使用TGA文件作为纹理
举报原因:
原因补充:

(最多只允许输入30个字)