OpenGL中的纹理映射

来源:互联网 发布:c语言换行符号 编辑:程序博客网 时间:2024/05/17 06:54
GLfloat xrot;//x y z的旋转量GLfloat yrot;GLfloat zrot;GLuint texture[1];//存储一个纹理
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); // 载入位图,检查有无错误,如果位图没找到则退出 if (TextureImage[0]=LoadBMP("data/gougou.bmp")){Status=TRUE;// 将 Status 设为 TRUEglGenTextures(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);// 线形滤波}if (TextureImage[0])// 纹理是否存在{if (TextureImage[0]->data)// 纹理图像是否存在{free(TextureImage[0]->data);// 释放纹理图像占用的内存}free(TextureImage[0]);// 释放图像结构}return Status;// 返回 Status}

在头文件GLAUX.H中有定义

typedef struct _AUX_RGBImageRec {    GLint sizeX, sizeY;    unsigned char *data;} AUX_RGBImageRec;
文中自定义了一个函数LoadBMP(filename),返回一个AUX_RGBImageRec的指针,首先判断文件是否为空,能否正常打开,然后关闭文件,得到句柄
函数int LoadGLTextures()通过调用函数LoadBMP来载入位图,并转化为纹理。任然检查纹理是否存在,在刻画完纹理后清空释放所占内存

初始化中要启动相应的纹理刻画函数

int InitGL(GLvoid){if (!LoadGLTextures())// 调用纹理载入子例程{return FALSE;// 如果未能载入,返回FALSE}glEnable(GL_TEXTURE_2D);// 启用纹理映射 glShadeModel(GL_SMOOTH);//阴影平滑 glClearColor(0.0f,0.0f,0.0f,0.0f); //黑色的背景 glClearDepth(1.0f); glEnable(GL_DEPTH_TEST);// 启用深度测试  glDepthFunc(GL_LEQUAL);  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// 告诉系统对透视进行修正return true;}
然后具体的画纹理

int DrawGLScene(GLvoid)// 从这里开始进行所有的绘制{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除屏幕和深度缓存glLoadIdentity();// 重置当前的模型观察矩阵glTranslatef(0.0f,0.0f,-5.0f);// 移入屏幕 5 个单位glRotatef(xrot,1.0f,0.0f,0.0f);// 绕X轴旋转glRotatef(yrot,0.0f,1.0f,0.0f);// 绕Y轴旋转glRotatef(zrot,0.0f,0.0f,1.0f);// 绕Z轴旋转    glBindTexture(GL_TEXTURE_2D, texture[0]);// 选择纹理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);// 纹理和四边形的左上// 后面glTexoord2f(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();xrot+=0.1f;// X 轴旋转yrot+=0.1f;// Y 轴旋转zrot+=0.1f;// Z 轴旋转return true;// 继续运行}
刻画纹理就是调用上面的纹理,纹理就是图片,注意将图片的每个坐标与正方体的每个面的坐标相对应
其实与前面的区别就在于开始的纹理调用刻画的过程,在具体刻画的时候注意对应坐标的问题


0 0
原创粉丝点击