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

    习惯了自己编写一些常用的代码,并打包成可随时可用的类。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文件:

太长,无法贴。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值