




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AUX_RGBImageRec auxRGBImageLoad 等函数意义 分类: opengl学习笔记2012-07-26 14:00416人阅读评论(0)收藏举报filtertexturescomponents图形nullfileOpenGL可以把纹理映射到指定的图形的表面上。简单一点的,就是给平面映射纹理,比如一个四边形,一个长方体的6个面,都可以指定位图作为纹理映射到各个面上。关于将一个位图作为纹理映射到某个或者多个面上,可以学习Jeff Molofee的OpenGL系列教程。对于指定的多个纹理,要根据自己的需要映射到不同的面上,需要对位图创建一个数组,用来存储位图的名称,然后在初始化OpenGL的时候,可以读取这些位图,然后生成多个纹理存储到一个纹理数组中,接着就可以指定绘制的某个面,对该指定的面进行纹理映射。下面,在的Jeff Molofee教程的第六课的基础上,实现对6个面分别进行不同的纹理映射。准备工作就是制作6幅不同的位图,如图所示:关键代码及其说明如下。创建全局纹理数组GLuint texture6; / 创建一个全局的纹理数组,用来存储将位图转换之后得到的纹理,对应于立方体的6个面加载位图文件加载位图,也就是把位图读取到内存空间,实现纹理的创建,加载位图的函数说明一下:AUX_RGBImageRec *LoadBMP(char *Filename) / 根据位图文件的名称进行加载FILE *File=NULL; / 文件指针if (!Filename) / 如果没有指定位图文件名称就返回NULLreturn 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)或者auxRGBImageLoadA(LPCSTR),可以在该库文件中找到它的定义,如下所示:/* AUX_RGBImageRec * APIENTRY auxRGBImageLoad(LPCTSTR); */#ifdef UNICODE#define auxRGBImageLoad auxRGBImageLoadW#else#define auxRGBImageLoad auxRGBImageLoadA#endifAUX_RGBImageRec * APIENTRY auxRGBImageLoadA(LPCSTR);AUX_RGBImageRec * APIENTRY auxRGBImageLoadW(LPCWSTR);#ifdef UNICODE#define auxDIBImageLoad auxDIBImageLoadW#else#define auxDIBImageLoad auxDIBImageLoadA#endifAUX_RGBImageRec * APIENTRY auxDIBImageLoadA(LPCSTR);AUX_RGBImageRec * APIENTRY auxDIBImageLoadW(LPCWSTR);宏auxDIBImageLoad实现的功能就是:根据指定的位图名称,将该位图的信息加载到内存中,以便用来创建成为纹理。创建纹理并加载纹理用于创建并加载纹理的函数为LoadGLTextures,实现如下所示:int LoadGLTextures() / 根据加载的位图创建纹理int Status=FALSE; / 指示纹理创建是否成功的标志AUX_RGBImageRec *TextureImage6; / 创建一个纹理图像数组,这里指定数组大小为6memset(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; isizeX, TextureImagei-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImagei-data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);if (TextureImagei) / 释放位图数组占用的内存空间if (TextureImagei-data) free(TextureImagei-data); free(TextureImagei); return Status; / 创建纹理并加载,返回成功或者失败的标志Status上述函数是创建和加载纹理的核心实现。1、glGenTextures函数其中,调用了glGenTextures函数,查看MSDN可以看到,声明如下所示:void glGenTextures(GLsizei n, GLuint * textures );函数参数的含义:n 生成的纹理的名称的个数;textures 生成的纹理名称所存储位置的指针,也就是一个纹理数组的内存地址,或者说是数组首元素的内存地址。函数被调用,会生成一系列纹理的名字,并存储到指定的数组中。2、glBindTexture函数glBindTexture函数实现了将调用glGenTextures函数生成的纹理的名字绑定到对应的目标纹理上。该函数的声明如下所示:void glBindTexture(GLenum target, GLuint texture );函数参数的含义:target 纹理被绑定的目标,它只能取值GL_TEXTURE_1D或者GL_TEXTURE_2D;texture 纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用。3、glTexImage2D函数调用glTexImage2D函数,用来指定二维纹理图像。该函数的声明如下所示:void glTexImage2D(GLenum target, GLint level, GLint components, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels );函数参数的含义:target 指定目标纹理,必须为GL_TEXTURE_2D;level 指定图像级别的编号,0表示基本图像,其它可以参考MSDN;components 纹理中颜色组件的编号,可是是1或2或3或4;width 纹理图像的宽度;height 纹理图像的高度;border 纹理图像的边框宽度,必须是0或1;format 指定像素数据的格式,一共有9个取值:GL_COLOR_INDEX、GL_RED、GL_GREEN、GL_BLUE、GL_ALPHA、GL_RGB、GL_RGBA、GL_BGR_EXT、GL_BGRA_EXT、GL_LUMINANCE、GL_LUMINANCE_ALPHA ,具体含义可以参考MSDN;type 像素数据的数据类型,取值可以为GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, and GL_FLOAT;pixels 内存中像素数据的指针。4、glTexParameteri函数glTexParameteri函数或者glTexParameterf函数用来设置纹理参数,声明如下所示:void glTexParameterf(GLenum target, GLenum pname, GLfloat param );void glTexParameteri(GLenum target, GLenum pname, GLint param );函数参数的含义:target 目标纹理,必须为GL_TEXTURE_1D或GL_TEXTURE_2D;pname 用来设置纹理映射过程中像素映射的问题等,取值可以为:GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER、GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_T,详细含义可以查看MSDN;param 实际上就是pname的值,可以参考MSDN。另外,该类函数还有两个:void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params );void glTexParameteriv(GLenum target, GLenum pname, const GLint *params );上述程序中调用如下:glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);功能就是实现线形滤波的功能,当纹理映射到图形表面以后,如果因为其它条件的设置导致纹理不能更好地显示的时候,进行过滤,按照指定的方式进行显示,可能会过滤掉显示不正常的纹理像素。纹理映射过程纹理映射的过程是在DrawGLScene函数中实现的,也就是在绘制图形的过程中,直接进行我呢里映射,或者称为,为指定的平面贴纹理,DrawGLScene函数实现如下所示:int DrawGLScene(GLvoid) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-5.0f);glRotatef(xrot,1.0f,0.0f,0.0f);glRotatef(yrot,0.0f,1.0f,0.0f);glRotatef(zrot,0.0f,0.0f,1.0f);/ Front FaceglBindTexture(GL_TEXTURE_2D, texture0); / 选择第一个纹理texture0,进行贴纹理glBegin(GL_QUADS);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);glEnd();/ Back FaceglBindTexture(GL_TEXTURE_2D, texture1); / 选择第二个纹理texture1,进行贴纹理glBegin(GL_QUADS);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);glEnd();/ Top FaceglBindTexture(GL_TEXTURE_2D, texture2); / 选择第三个纹理texture2,进行贴纹理glBegin(GL_QUADS);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);glEnd();/ Bottom FaceglBindTexture(GL_TEXTURE_2D, texture3); / 选择第四个纹理texture3,进行贴纹理glBegin(GL_QUADS);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);glEnd();/ Right faceglBindTexture(GL_TEXTURE_2D, texture4); / 选择第五个纹理texture4,进行贴纹理glBegin(GL_QUADS);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);glEnd();/ Left FaceglBindTexture(GL_TEXTURE_2D, texture5); / 选择第六个纹理texture5,进行贴纹理glBegin(GL_QUADS);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);glEnd();xrot+=0.3f;yrot+=0.2f;zrot+=0.4f;return TRUE; 因为,通过前面的过程,已经将位图加载并创建和加载纹理成功,纹理数组已经存在于内存之中,调用上述函数实现纹理映射,即,从内存中取出指定的纹理,将其映射到立方体的指定的面上。上述函数中调用了glTexCoord2f函数,设置纹理坐标,该函数的声明如下所示:void glTexCoord2f(GLfloat s, GLfloat t );glTexCoord2f 的第一个参数是X坐标,当s=0.0f 时是纹理的左侧,s=0.5f 时是纹理的中点,s=1.0f 时是纹理的右侧。 glTexCoord2f 的第二个参数是Y坐标,t=0.0f 是纹理的底部,t=0.5f 是纹理的中点, t=1.0f 是纹理的顶部。上述函数在为前面那个面映射纹理的时候调用如下:/ Front FaceglBindTexture(GL_TEXTURE_2D, texture0);glBegin(GL_QUADS);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);glTexCoord2f(0.0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园生活老师职责培训大纲
- 2026届北京市人民大附属中学化学九上期末学业水平测试试题含解析
- 浙江省杭州市萧山区厢片五校2026届九年级化学第一学期期中质量检测模拟试题含解析
- 2025电工技师考试题库及参考答案
- 2025年风力发电运维值班员(技师)职业技能鉴定考试题库(含答案)
- 2026届陕西省安康紫阳县联考化学九年级第一学期期中学业质量监测模拟试题含解析
- 2026届天津市和平区二十中学化学九年级第一学期期中检测试题含解析
- 花卉的秘密课件-2024-2025学年湘美版(2024)初中美术七年级下册
- 2026届海南省临高县美台中学化学九上期中调研试题含解析
- 2026届广东省揭阳揭西县联考九上化学期中考试试题含解析
- Unit 2 单元测试卷-2024-2025学年人教版七年级英语上册
- 2025股权技术入股合同
- 钢桁架桥制作施工方案
- 2025年高中学业水平合格性考试政治模拟试卷试题(含答案解析)
- 2024年食品安全抽检监测技能大比武理论考试题库(含答案)
- 北师大版小学数学五年级上册第一单元《练习一》同步练习带答案
- 球墨铸铁管规格尺寸理论重量表
- 饮食习惯与健康
- 华为人力资源管理纲要2.0
- 第二章 园艺设施的类型、结构、性能及应用
- 银行卡收单外包服务协议范本
评论
0/150
提交评论