类: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深入探索——纹理加载(ImageMagick)与贴图

转载自:第十六课 基本的纹理贴图 背景 纹理贴图就是将任意一种类型的图片应用到 3D 模型的一个或多个面上。图片(也可以称之为纹理)内容可以是任何东西,但是他们一般都是一些比如砖,叶子,地面等的图案,...
  • panda1234lee
  • panda1234lee
  • 2016年06月23日 19:25
  • 1286

OpenGL学习笔记——纹理贴图

简单地说,纹理就是矩形的数据数组。例如,颜色数据、亮度数据、颜色和alpha数据。纹理数组中的单个值常常称为纹理单元(texel)。纹理贴图之所以复杂,是因为矩形的纹理可以映射到非矩形的区域,并且必须...
  • xuexiaokkk
  • xuexiaokkk
  • 2015年10月30日 16:23
  • 8230

OpenGL-纹理读取BMP图片-代码

使用两种方法读取bmp图片,来作为OpenGL纹理。 1.通过对bmp格式的了解,http://blog.csdn.net/o_sun_o/article/details/8351037(详细解析b...
  • bigmoyu
  • bigmoyu
  • 2017年07月21日 10:52
  • 275

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

    习惯了自己编写一些常用的代码,并打包成可随时可用的类。CTexture就是一个读取纹理的类,可以方便的应用到OpenGL中。个人感觉不错。头文件:/**//******************...
  • TheThinBoy
  • TheThinBoy
  • 2007年09月20日 17:17
  • 2699

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

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

OpenGL学习笔记4:纹理

原始图像数据像素包装图像数据在内存中很少以紧密包装的形式存在。在许多硬件平台上,处于性能上的考虑,一幅图像的每一行都应该从一种特定字节对齐地址开始。绝大多数编译器会自动把变量和缓冲区放置在一个针对该架...
  • ylbs110
  • ylbs110
  • 2016年06月30日 22:33
  • 4922

openCV读入图片,openGL实现纹理贴图

本文结合结合openCV,openGL的优点,实现混合编程。 (1)OpenCV提供图形处理和计算机视觉方面的通用算法,读入二维图片很方便; (2)OpenGL是跨平台的图形程序接口,它用于二维,...
  • learn_sunzhuli
  • learn_sunzhuli
  • 2015年06月25日 22:44
  • 2630

使用glfw库将OpenCV读取到的图片作为OpenGL的背景纹理贴图

转载请注明出处:http://my.csdn.NET/ye_shen_wei_mian 前段时间接触过一点glfw,个人而言不太喜欢freeglut的回调机制,glfw不失为一个可以替代的选择。 ...
  • ye_shen_wei_mian
  • ye_shen_wei_mian
  • 2017年06月23日 17:29
  • 516

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

转载:不用AuxDIBImageLoad()向opengl中载入bmp纹理  原文地址:http://www.cnblogs.com/gaoteng/archive/2011/12/03/2350...
  • aizj199
  • aizj199
  • 2015年05月07日 20:32
  • 396

OpenGL Shader编程:NV12 转 RGB

OpenGL Shader编程:NV12 转 RGB最近在学习FFmpeg调用Nvidia硬件编解码,其中在解码这里计划做一个多路硬件解码加显示。由于使用了显卡来干活那么CPU注定是个酱油角色,初步规...
  • WuNLK
  • WuNLK
  • 2017年08月09日 22:21
  • 429
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类:CTexture,OpenGL中读取多种纹理的类。支持bmp,tga,rgb,rgba等
举报原因:
原因补充:

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