OPENGL载入纹理图像.docx_第1页
OPENGL载入纹理图像.docx_第2页
OPENGL载入纹理图像.docx_第3页
OPENGL载入纹理图像.docx_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AUX_RGBImageRec *LoadBMP(char *Filename)/ 载入位图图象FILE *File=NULL;/ 文件句柄接下来检查文件名是否已提供。因为 LoadBMP() 可以无参数调用,所以我们不得不检查一下。您可不想什么都没载入吧.:)if (!Filename)/ 确保文件名已提供return NULL;/ 如果没提供,返回 NULL接着检查文件是否存在。下面这一行尝试打开文件。File=fopen(Filename,r);/ 尝试打开文件如果我们能打开文件的话,很显然文件是存在的。使用 fclose(File) 关闭文件。 auxDIBImageLoad(Filename) 读取图象数据并将其返回。if (File)/ 文件存在么?fclose(File);/ 关闭句柄return auxDIBImageLoad(Filename);/ 载入位图并返回指针如果我们不能打开文件,我们将返回NULL。这意味着文件无法载入。程序在后面将检查文件是否已载入。如果没有,我们将退出程序并弹出错误消息。return NULL;/ 如果载入失败,返回 NULL下一部分代码载入位图(调用上面的代码)并转换成纹理。int LoadGLTextures()/ 载入位图(调用上面的代码)并转换成纹理然后设置一个叫做 Status 的变量。我们使用它来跟踪是否能够载入位图以及能否创建纹理。 Status 缺省设为 FALSE (表示没有载入或创建任何东东)。int Status=FALSE;/ 状态指示器现在我们创建存储位图的图像记录。次记录包含位图的宽度、高度和数据。AUX_RGBImageRec *TextureImage1;/ 创建纹理的存储空间清除图像记录,确保其内容为空memset(TextureImage,0,sizeof(void *)*1);/ 将指针设为 NULL现在载入位图,并将其转换为纹理。 TextureImage0=LoadBMP(Data/NeHe.bmp) 调用 LoadBMP() 的代码。载入 Data 目录下的 NeHe.bmp 位图文件。如果一切正常,图像数据将存放在 TextureImage0 中, Status 被设为 TRUE ,然后我们开始创建纹理。/ 载入位图,检查有无错误,如果位图没找到则退出if (TextureImage0=LoadBMP(Data/NeHe.bmp)Status=TRUE;/ 将 Status 设为 TRUE现在使用中 TextureImage0 的数据创建纹理。第一行 glGenTextures(1, &texture0) 告诉OpenGL我们想生成一个纹理名字(如果您想载入多个纹理,加大数字)。值得注意的是,开始我们使用 GLuint texture1 来创建一个纹理的存储空间,您也许会认为第一个纹理就是存放在 &texture1 中的,但这是错的。正确的地址应该是 &texture0 。同样如果使用 GLuint texture2 的话,第二个纹理存放在 texture1 中。译者注:学C的,在这里应该没有障碍,数组就是从零开始的嘛。 第二行 glBindTexture(GL_TEXTURE_2D, texture0) 告诉OpenGL将纹理名字 texture0 绑定到纹理目标上。2D纹理只有高度(在 Y 轴上)和宽度(在 X 轴上)。主函数将纹理名字指派给纹理数据。本例中我们告知OpenGL, &texture0 处的内存已经可用。我们创建的纹理将存储在 &texture0 的 指向的内存区域。glGenTextures(1, &texture0);/ 创建纹理/ 使用来自位图数据生成 的典型纹理glBindTexture(GL_TEXTURE_2D, texture0);下来我们创建真正的纹理。下面一行告诉OpenGL此纹理是一个2D纹理 ( GL_TEXTURE_2D )。参数“0”代表图像的详细程度,通常就由它为零去了。参数三是数据的成分数。因为图像是由红色数据,绿色数据,蓝色数据三种组分组成。 TextureImage0-sizeX 是纹理的宽度。如果您知道宽度,您可以在这里填入,但计算机可以很容易的为您指出此值。 TextureImage0-sizey 是纹理的高度。参数零是边框的值,一般就是“0”。 GL_RGB 告诉OpenGL图像数据由红、绿、蓝三色数据组成。GL_UNSIGNED_BYTE 意味着组成图像的数据是无符号字节类型的。最后. TextureImage0-data 告诉OpenGL纹理数据的来源。此例中指向存放在 TextureImage0 记录中的数据。/ 生成纹理glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data);下面的两行告诉OpenGL在显示图像时,当它比放大得原始的纹理大 ( GL_TEXTURE_MAG_FILTER )或缩小得比原始得纹理小( GL_TEXTURE_MIN_FILTER )时OpenGL采用的滤波方式。通常这两种情况下我都采用 GL_LINEAR 。这使得纹理从很远处到离屏幕很近时都平滑显示。使用 GL_LINEAR 需要CPU和显卡做更多的运算。如果您的机器很慢,您也许应该采用 GL_NEAREST 。过滤的纹理在放大的时候,看起来斑驳的很译者注:马赛克啦。您也可以结合这两种滤波方式。在近处时使用 GL_LINEAR ,远处时 GL_NEAREST 。glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);/ 线形滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/ 线形滤波现在我们释放前面用来存放位图数据的内存。我们先查看位图数据是否存放在处。如果是的话,再查看数据是否已经存储。如果已经存储的话,删了它。接着再释放 TextureImage0 图像结构以保证所有的内存都能释放。if (TextureImage0)/ 纹理是否存在if (TextureImage0-data)/ 纹理图像是否存在free(TextureImage0-data);/ 释放纹理图像占用的内存free(TextureImage0);/ 释放图像结构最后返回状态变量。如果一切OK,变量 Status 的值为 TRUE 。否则为 FALSE 。return Status;/ 返回 StatusAUX_RGBImageRec *LoadBMP(char *Filename)/ Loads A Bitmap ImageFILE *File=NULL;/ File Handleif (!Filename)/ Make Sure A Filename Was Givenreturn NULL;/ If Not Return NULLFile=fopen(Filename,r);/ Check To See If The File Existsif (File)/ Does The File Exist?fclose(File);/ Close The Handlereturn auxDIBImageLoad(Filename);/ Load The Bitmap And Return A Pointerreturn NULL;/ If Load Failed Return NULLint LoadGLTextures()/ Load Bitmaps And Convert To Texturesint Status=FALSE;/ Status IndicatorAUX_RGBImageRec *TextureImage1;/ Create Storage Space For The Texturememset(TextureImage,0,sizeof(void *)*1); / Set The Pointer To NULL/ Load The Bitmap, Check For Errors, If Bitmaps Not Found Quitif (TextureImage0=LoadBMP(Data/NeHe.bmp)Status=TRUE;/ Set The Status To TRUEglGenTextures(1, &texture0);/ Create The Texture/ Typical Texture Generation Using Data From The BitmapglBindTexture(GL_TEXTURE_2D, texture0);glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);if (Textur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论