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;
}

各种移动GPU压缩纹理的使用方法

介绍了各种移动设备所使用的GPU,以及各个GPU所支持的压缩纹理的格式和使用方法。 1. 移动GPU大全 目前移动市场的GPU主要有四大厂商系列: 1)Imagination Techn...
  • wanglang3081
  • wanglang3081
  • 2013年04月30日 14:23
  • 6924

OpenGL学习笔记6:高级纹理知识

矩形纹理纹理目标为GL_TEXTURE_RECTANGLE。 首选,矩形纹理不能进行Mip贴图; 然后,矩形纹理不是标准化的(实际上是对像素寻址) 最后,纹理坐标不能重复,并且不支持纹理压缩加载...
  • ylbs110
  • ylbs110
  • 2016年07月16日 20:03
  • 2615

opengl导入3DS文件(带纹理)之填坑

一、3ds导入工具 CLoad3DS.h和CLoad3DS.cpp " target="_blank">CLoad3DS.h和CLoad3DS.cpp 二、使用方法 1、在你工程中加入头文件    ...
  • qq_28088659
  • qq_28088659
  • 2017年03月06日 22:10
  • 1150

TGA文件格式整理

整理自: http://dev.gameres.com/Program/Visual/Other/TGAFormat.htm http://blog.csdn.net/yyfzy/article/de...
  • Blues1021
  • Blues1021
  • 2015年05月02日 11:30
  • 3368

使用Part上传附件

/* * To change this template, choose Tools | Templates * and open the template in the editor. */ ...
  • kcj991932907
  • kcj991932907
  • 2014年11月27日 21:01
  • 628

[转载]TGA文件内部格式及程序实现

原文地址1:TGA文件内部格式及程序实现作者:宁波搬家 原文地址2:TGA文件的加载 作者:wangguang246 (本人取了原文地址1中的对文件格式的解释部分,取了原文地址2的源代码重...
  • JiLuoXingRen
  • JiLuoXingRen
  • 2013年07月21日 02:41
  • 3003

Opengl读取TGA图片信息代码

首先是了解opengl里AUX_RGBImageRec的定义,它包含图片宽高和数据 typedef struct _AUX_RGBImageRec {     GLint sizeX,sizeY;...
  • hbyzl
  • hbyzl
  • 2017年05月26日 21:31
  • 382

主流GPU纹理格式

本文主要介绍主流移动设备GPU,以及所支持的压缩格式 1.GPU分类 1.1 Imagination Technologies的PowerVR SGX系列     代表型号:PowerVR ...
  • jaccen
  • jaccen
  • 2016年04月18日 10:45
  • 1526

各种图片格式(BMP,JPG, GIF,PNG, TGA) 简单介绍

BMP格式: Windows系统下的标准位图格式,未经过压缩,一般图像文件会比较大。在很多软件中被广泛应用.所以编程的时候用opencv,是不是首先应该考虑BMP格式会比较好,因为看到很多大神的源...
  • hyqsong
  • hyqsong
  • 2015年11月17日 10:23
  • 1947

OpenGL9-(FreeImage)加载图片-作为纹理

/*** 这个例子展示如何使用FreeImage加载图片作为纹理* 初学者,在学习OpenGL的时候,往往因为OpenGL读图片没有那么方便* 而浪费了大量的时间在研究图片格式上,其实大可...
  • qq_26280299
  • qq_26280299
  • 2015年07月03日 14:59
  • 1498
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Part 10 使用TGA文件作为纹理
举报原因:
原因补充:

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