首页 > 代码库 > opengl纹理贴图

opengl纹理贴图

头文件包含#include<stdio.h>//标准输入输出的库文件

#include <gl\glaux.h>  //glaux库的头文件

GLfloat xrot;    // X 旋转

GLfloat yrot;    // Y 旋转

GLfloat zrot;    // Z 旋转

GLuint texture[1];   // 用于存储一个纹理

值得注意的是载入图像的宽和高必须是2的n次方,宽度和高度最小必须是64象素,并且出于兼容性的原因,图像的宽度和高度不应超过256象素。

AUX_RGBImageRec *LoadBMP(char *Filename)    // 载入位图

{

     FILE *File=NULL;         // 文件句柄

     if (!Filename)          

      {   

          return NULL;        

     }

   File=fopen(Filename,"r");      // 尝试打开文件

   if (File)         

 {  

     fclose(File);         

     return auxDIBImageLoad(Filename);    // 载入位图并且返回指针

 }

   return NULL;        

}

int LoadGLTextures()         //载入位图并且转换成纹理

{  int Status=FALSE;         // 状态标志

 AUX_RGBImageRec *TextureImage[1];     // 创建纹理存储空间

 memset(TextureImage,0,sizeof(void *)*1);            // 设置指针为NULL

 if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))     //载入位图,检查有无错误,如果位图没找到则退出

 {   Status=TRUE;         

  glGenTextures(1, &texture[0]);   创建纹理

  glBindTexture(GL_TEXTURE_2D, texture[0]);  //使用来自位图的数据生成典型的纹理

 glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);   

  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

 }

    第一行 glGenTextures(1, &texture[0]) 告诉OpenGL我们想生成一个纹理名字(如果您想载入多个纹理,加大数字)。值得注意的是,开始我们使用 GLuint texture[1] 来创建一个纹理的存储空间,您也许会认为第一个纹理就是存放在 &texture[1] 中的,但这是错的。正确的地址应该是 &texture[0] 。同样如果使用 GLuint texture[2] 的话,第二个纹理存放在 texture[1] 中。

    下面一行告诉OpenGL此纹理是一个2D纹理 ( GL_TEXTURE_2D )。参数“0”代表图像的详细程度,通常就由它为零去了。参数三是数据的成分数。因为图像是由红色数据,绿色数据,蓝色数据三种组分组成。 TextureImage[0]->sizeX 是纹理的宽度。如果您知道宽度,您可以在这里填入,但计算机可以很容易的为您指出此值。 TextureImage[0]->sizey 是纹理的高度。参数零是边框的值,一般就是“0”。 GL_RGB 告诉OpenGL图像数据由红、绿、蓝三色数据组成。GL_UNSIGNED_BYTE 意味着组成图像的数据是无符号字节类型的。TextureImage[0]->data 告诉OpenGL纹理数据的来源。此例中指向存放在 TextureImage[0] 记录中的数据。

 if (TextureImage[0])        

{   if (TextureImage[0]->data)       

    {  

          free(TextureImage[0]->data);     // 释放纹理图像占用的内存

     }

     free(TextureImage[0]);        // 释放纹理结构

 }

 return Status;         

}

在InitGL()中增加下面几行

if (!LoadGLTextures())        // 调用咱如纹理子程序例程

 {  

 return FALSE;         

}

 glEnable(GL_TEXTURE_2D);       // 开启纹理映射

在绘图子函数中进行纹理映射:

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity(); 
  glTranslatef(0.0f,0.0f,-5.0f);

  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); 
  
  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); 
  
  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); 
  
  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); 

  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); 

  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();

 

 

opengl纹理贴图