您的位置:首页 > 运维架构

OpenGL小探3——纹理映射

2014-11-01 14:44 176 查看
纹理映射
纹理映射相关函数:
void glGenTextures(GLsizei n, GLuint *textures);
void glBindTexture(GLenum target, GLuint texture);
#include <stdio.h>
#include <GL/glaux.h> //在Qt中的头文件
GLfloat xrot; //x旋转量
GLfloat yrot;
GLfloat zrot;
GLuint texture[1]; //存储一个纹理
//位图宽高应是64,128,256像素
AUX_RGBImageRec *LoadBMP(char* FileName e){ //载入位图图像
FILE *File = NULL; //文件句柄
if(!e)
return NULL;
File = fopen(e,"r");
if(File) {
flose(File);
return auxDIBImageLoad(e);
}else
return NULL;
}
int LoadGLTextures(){ //载入位图并转换成纹理
int Status = FALSE;
AUX_RGBImageRec *TextureImage[1]; //存储纹理
memset(TextureImage,0,sizeof(void*)*1); //将指针设为NULL
if(TextureImage[0] = LoadBMP("Data.bmp")){
Status = TRUE;
glGenTextures(1,&texture[0]); //创建一个纹理
glBindTexture(GL_TEXTURE_2D,texture[0]); //&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;
}
int InitGL(GLvoid){     //此处开始对OpenGL进行所有设置
if(!LoadGLTextures()){  //调用纹理载入子例程
return FALSE;       //载入失败
}
glEnable(GL_TEXTURE_2D); //启用纹理映射
glShadeModel(GL_SMOOTH);  //阴影平滑
glClearColor(0.0f,0.0f,0.0f,0.5f);  //黑色背景
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个单位
glRotate(xrot,1.0f,0.0f,0.0f);  //绕x轴旋转
glRotate(yrot,0.0f,1.0f,0.0f);
glRotate(zrot,0.0f,0.0f,1.0f);
glBindTexture(GL_TEXTURE_2D,texture[0]); //绑定纹理,不能在glBegin()和glEnd()之间
//为了将纹理正确的映射到四边形上,必须将纹理的右上角映射到四边形的右上角,如此等等。
//glTexCoord2f参数为x,y坐标:0.0f是纹理的左侧/底部,0.0f是中点,1.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(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();
xrot += 0.3f;
yrot += 0.2f;
zrot += 0.4f;
return true;
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: