类:CTexture,OpenGL中读取多种纹理的类。支持bmp,tga,rgb,rgba等

原创 2007年09月20日 17:17:00

    习惯了自己编写一些常用的代码,并打包成可随时可用的类。CTexture就是一个读取纹理的类,可以方便的应用到OpenGL中。个人感觉不错。

头文件:

/*************************************************************************
* 读取纹理的类 CTexture
* 作者:  (QQ=63659875 Email=guojianbest@163.com)
*
* 最后修改2007-4-23,加入RGB(A)读入
*
* 可以读取BMP,TGA,RGB,JPG(未做)文件.
* 使用前必须要包含相关的头文件和库
* 部分源码来源于网络,如果错误请联系
*
* 简洁的使用方法:
*1.  定义变量 CTexture m_texture;
*2.  在初始化中载入纹理 m_texture.LoadBMP("test.bmp");
*    如果是带有通道的则这样 m_texture.LoadAlphaBMP("test.bmp");
*3.  绑定纹理,开始绘制
*    glEnable(GL_TEXTURE_2D);
*    glBindTexture(GL_TEXTURE_2D,m_texture.GetID());
*    m_texture.EnableAlpha(true); //如果是带有通道
*    glBegin(...);
*    glTexCoord2f(...); //纹理坐标
*    glEnd();
*    m_texture.EnableAlpha(false); //如果是带有通道
*    glDisable(GL_TEXTURE_2D);
**************************************************************************
*/


#ifndef _TEXTURE_H
#define _TEXTURE_H

/*/////////////////////////////////////////////////////////////////////////
//载入OpenGL相关的头文件
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>
//载入OpenGL相关的库
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
#pragma comment( lib, "glaux.lib" )
/////////////////////////////////////////////////////////////////////////
*/


#define BITMAP_ID   0x4D42 

//TGA信息的结构体
struct TGAInfoHeader
{
    unsigned 
char m_ucHeader[6];
    unsigned 
int  m_uiBytesPerPixel;
    unsigned 
int  m_uiImageSize;
    unsigned 
int  m_uiTemp;
    unsigned 
int  m_uiType;    
    unsigned 
int  m_uiHeight;
    unsigned 
int  m_uiWidth;
    unsigned 
int  m_uiBPP;
}
;
extern unsigned char ucUTGAcompare[12];
extern unsigned char ucCTGAcompare[12];

//RGB
typedef struct _ImageRec 
{
    unsigned 
short imagic;
    unsigned 
short type;
    unsigned 
short dim;
    unsigned 
short xsize, ysize, zsize;
    unsigned 
int min, max;
    unsigned 
int wasteBytes;
    
char name[80];
    unsigned 
long colorMap;
    FILE 
*file;
    unsigned 
char *tmp, *tmpR, *tmpG, *tmpB;
    unsigned 
long rleEnd;
    unsigned 
int *rowStart;
    
int *rowSize;
}
ImageRec;

//////////////////////////////////////////////////////////////////////////
//类定义开始
class CTexture
{
    unsigned 
int m_ID;
    unsigned 
int m_width;
    unsigned 
int m_height;
    unsigned 
char* m_ucpData;
    unsigned 
int   m_uiBPP;
    unsigned 
int   m_uiWidth;
    unsigned 
int   m_uiHeight;
    
bool m_bIsLoaded;

public:
    CTexture();
    
~CTexture();

    
//载入普通的bmp
    bool LoadBMP(char *fName);       
    
//载入bmp带有模拟的alpha通道
    
//必须是24位的BMP文件,黑色作为透明的颜色
    bool LoadAlphaBMP(char *fName);  
    
//载入bmp-detail贴图
    bool LoadDetailBMP(char *fName); 
    
bool LoadRGB(char *fName);       //载入rgb
    bool LoadRGBA(char *fName);  //rgb带有alpha通道,即rgba文件
    
//载入tga(压缩或者未压缩的; 24位,32位都可以)
    bool LoadTGA(char *fName); 
    
//带有alpha通道的TGA,必须是32位的
    bool LoadAlphaTGA(char *fName);
    
//tga-detail贴图
    bool LoadDetailTGA(char * fName);

    
//获得纹理的ID
    inline unsigned int GetID(void){
        
return m_ID;
    }
;
    
//得到宽度
    inline unsigned int GetWidth(void){
        
return m_width;
    }
;
    
//得到高度
    inline unsigned int GetHeight(void){
        
return m_height;
    }
;
    
//是否载入完成
    inline bool isLoaded(void){
        
return m_bIsLoaded;
    }
;
    
//开启Alpha
    inline void EnableAlpha(bool b){
        
if(b){
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            glEnable(GL_ALPHA_TEST);
            glAlphaFunc(GL_GREATER, 
0);
            glEnable(GL_BLEND);
        }

        
else{
            glDisable(GL_ALPHA_TEST);
            glDisable(GL_BLEND);
        }

    }


    
bool Load( char* a_szFilename, float a_fMinFilter, float a_fMaxFilter, bool a_bMipmap= false );


protected:
    
bool LoadBMPData(char* a_szFilename, float a_fMinFilter, float a_fMaxFilter, bool a_bMipmap= false);
    AUX_RGBImageRec 
*LoadBMPFile(CHAR *Filename);
    unsigned 
char *LoadBitmapFile(char *filename, BITMAPINFOHEADER *bitmapInfoHeader);//未使用
    unsigned char *LoadBitmapFileWithAlpha(char *filename, BITMAPINFOHEADER *bitmapInfoHeader);//未使用
    bool LoadCompressedTGA( void );
    
bool LoadUncompressedTGA( void );
    
bool LoadData(char * szFilename);
    
bool Create( unsigned int uiWidth, unsigned int uiHeight, unsigned int uiBPP );

    
//RGB
    void bwtorgba(unsigned char *b,unsigned char *l,int n);
    
void latorgba(unsigned char *b, unsigned char *a,unsigned char *l,int n);
    
void rgbtorgba(unsigned char *r,unsigned char *g,unsigned char *b,unsigned char *l,int n); 
    
void rgbatorgba(unsigned char *r,unsigned char *g,unsigned char *b,unsigned char *a,unsigned char *l,int n); 
    
void ConvertShort(unsigned short *array, long length); 
    
void ConvertLong(unsigned *array, long length); 
    ImageRec 
* ImageOpen(const char *fileName);
    
void ImageClose(ImageRec *image); 
    
void ImageGetRow(ImageRec *image, unsigned char *buf, int y, int z); 
    unsigned 
char* read_texture(char *name, int *width, int *height, int *components); 
}
;
#endif

cpp文件:

太长,无法贴。

 

相关文章推荐

OpenGL加载BMP文件

以下代码来自NeHe,基于第一课框架之上:http://download.csdn.net/source/1907052  1,定义一个全局变量来存储BMP文件:GLuint texture[1]; ...

OpenGL_ES加载TGA/BMP纹理

typedef struct TGAImage { GLubyte *imageData; // 图像数据 GLuint bpp; ...

opengl读取24位BMP文件为纹理并处理黑色背景为透明

原理: 直接用BITMAP数据而未用

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

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

OpenGL保存bmp图片(字节对齐与RGB分量转换)

http://blog.sina.com.cn/s/blog_60707c0f0100q9vf.html 现在的OpenGL己经具有GL_BGR_EXT的方式读取像素,默认己经是4字节对齐了,所...
  • xjujun
  • xjujun
  • 2012年01月11日 15:20
  • 3495

不用AuxDIBImageLoad()向opengl中载入bmp纹理

不用AuxDIBImageLoad()向opengl中载入bmp纹理 这个函数从硬盘中加载24位window DIB 位图。呵呵,解释的多了。为了节约时间,我没有加载整个bmp图的Header部分,而...

qt5_qml_Opengl_shader 第二弹----------------------纹理贴图(RGB)

此例程接上一例子: 上个例子是画简单的三角形,这个例子显示RGB纹理贴图   为什么叫RGB纹理贴图呢,因为次例子是向gpu传递RGB格式的buffer,来显示,后续会有例子向GPU传递YUV数据,在...

windows下利用gdi+读取图片并转换成opengl纹理支持的像素格式

利用windows自带的gdi+库,可以很方便地读取一般格式的图片,例如bmp,jpg和png。下面这段代码作为opengl贴纹理的第一步,首先读取图片其次转换成opengl支持的像素格式(从ARGB...

RGBA数据转存BMP图片

  • 2017年09月06日 11:51
  • 3KB
  • 下载

如何将OpenCV中的Mat类绑定为OpenGL中的纹理

如果要调用外接的USB摄像头获取图像通常使用OpenCV来调用,如果调用摄像头请参考本人的另一篇博客如果用OpenCV调用USB摄像头,如果不是,在读取本地图片和视频进行图像处理和分析也通常用Open...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类:CTexture,OpenGL中读取多种纹理的类。支持bmp,tga,rgb,rgba等
举报原因:
原因补充:

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