opengl纹理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OpenGL可以把纹理映射到指定的图形的表面上。简单一点的,就是给平面映射纹理,比如一个四边形,一个长方体的6个面,都

关于将一个位图作为纹理映射到某个或者多个面上,可以学习Jeff Molofee的OpenGL系列

对于指定的多个纹理,要根据自己的需要映射到不同的面上,需要对位图创建一个数组,用来存储位图的名称,然后在初始化Op

成多个纹理存储到一个纹理数组中,接着就可以指定绘制的某个面,对该指定的面进行纹理

下面,在的Jeff Molofee教程的第六课的基础上,实现对6个面分别进行不同的纹理映射

准备工作就是制作6幅不同的位图,如图所示:

关键代码及其说明如下。

创建全局纹理数组

GLuint texture[6]; // 创建一个全局的纹理数组,用来存储将位图转换之后得到的纹理,对应于立方

加载位图文件

加载位图,也就是把位图读取到内存空间,实现纹理的创建,加载位图的函数说明一下

AUX_RGBImageRec *LoadBMP(char *Filename) // 根据位图文件的名称进行加载

{

FILE *File=NULL; // 文件指针

if (!Filename) // 如果没有指定位图文件名称就返回NULL

{

return NULL;

}

File=fopen(Filename,"r"); // 根据指定的位图文件名称,打开该位图文件

if (File) // 如果位图文件存在

{

fclose(File); // 因为只是需要判断问题是否存在,而不需要对位图文件进行写操作,所以关闭位return auxDIBImageLoad(Filename); // 其实,只需要一个真正存在的位图文件的名称,实现加载位图文

}

return NULL; // 位图文件加载失败就返回NULL

}

上面实现加载位图的函数中,AUX_RGBImageRec是glaux.h中定义的类型,该类型的定义如下

/*

** RGB Image Structure

*/

typedef struct _AUX_RGBImageRec {

GLint sizeX, sizeY;

unsigned char *data;

} AUX_RGBImageRec;

首先,AUX_RGBImageRec类型是一个RGB图像结构类型。该结构定义了三个成员:

sizeX ——图像的宽度;

sizeY ——图像的高度;

data; ——图形所包含的数据,其实也就是该图形在内存中的像素数据的一个指针。

AUX_RGBImageRec类型的变量描述了一幅图像的特征。

上述函数中,调用了glaux.h库文件中的auxDIBImageLoad函数,其实它是一个宏,函数原型为auxRGBImageLoadW(LPCWSTR

在该库文件中找到它的定义,如下所示:

/* AUX_RGBImageRec * APIENTRY auxRGBImageLoad(LPCTSTR); */

#ifdef UNICODE

#define auxRGBImageLoad auxRGBImageLoadW

#else

#define auxRGBImageLoad auxRGBImageLoadA

#endif

AUX_RGBImageRec * APIENTRY auxRGBImageLoadA(LPCSTR);

AUX_RGBImageRec * APIENTRY auxRGBImageLoadW(LPCWSTR);

#ifdef UNICODE

#define auxDIBImageLoad auxDIBImageLoadW

#else

#define auxDIBImageLoad auxDIBImageLoadA

#endif

AUX_RGBImageRec * APIENTRY auxDIBImageLoadA(LPCSTR);

AUX_RGBImageRec * APIENTRY auxDIBImageLoadW(LPCWSTR);

宏auxDIBImageLoad实现的功能就是:根据指定的位图名称,将该位图的信息加载到内存中,以便用来

创建纹理并加载纹理

用于创建并加载纹理的函数为LoadGLTextures,实现如下所示:

int LoadGLTextures() // 根据加载的位图创建纹理

{

int Status=FALSE; // 指示纹理创建是否成功的标志

AUX_RGBImageRec *TextureImage[6]; // 创建一个纹理图像数组,这里指定数组大小为

memset(TextureImage,0,sizeof(void *)*6); // 初始化纹理图像数组,为其分配内存

char *pictures[] = { // 创建一个位图名称数组,对应6幅位图

"Data/No1.bmp",

"Data/No2.bmp",

"Data/No3.bmp",

"Data/No4.bmp",

"Data/No5.bmp",

"Data/No6.bmp"

};

for(int i=0; i<6; i++) // 遍历位图名称数组,根据位图名称分别生成

{

if (TextureImage[i]=LoadBMP(pictures[i])) // 加载位图i成功,修改状态标志变量Status为

{

Status=TRUE;

glGenTextures(1, &texture[i]); // 为第i个位图创建纹理

glBindTexture(GL_TEXTURE_2D, texture[i]); // 将生成的纹理的名称绑定到指定的纹理glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[i]->sizeX, TextureImage[i]->sizeY, 0, GL_RGB, GL_UNSIGNED

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

相关文档
最新文档