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;
}
相关文章推荐
- OpenGL 纹理坐标 和 顶点坐标映射关系 详解
- OpenGL 纹理映射
- OpenGL纹理映射
- OpenGL入门学习[十一 01] OpenGL纹理映射功能
- OpenGL教程之纹理映射
- OpenGL学习: 环境纹理映射(environment mapping)
- 【OpenGL】OpenGL系列——06纹理映射
- OpenGL中的纹理映射
- 纹理映射:Jeff Molofee(NeHe) 的 OPENGL 教程-第六课
- OpenGL-纹理映射Mipmap
- 【Qt OpenGL教程】15:图形字体的纹理映射
- opengl纹理映射的学习总结
- 为OpenGL考试而准备的代码——鼠标控制视角变换+简单纹理映射+键盘的光照控制+Bezier曲线
- OpenGL纹理映射演示程序代码
- OpenGL纹理映射的几个问题
- OpenGL纹理映射和光照效果
- OpenGL 二维纹理映射-3
- 【OPENGL】使用CxImage类 使PNG图片纹理映射(一):Cxiamge类配置
- OpenGL学习脚印: 二维纹理映射(2D textures)
- OpenGL之纹理映射(一)