OpenGL小探3——纹理映射

纹理映射
 
纹理映射相关函数:
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;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值