zoukankan      html  css  js  c++  java
  • OpenGL纹理映射

    GLfloat        xrot;                                // X 旋转量
    GLfloat yrot; // Y 旋转量
    GLfloat zrot; // Z 旋转量

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

    AUX_RGBImageRec *LoadBMP(char *Filename) // 载入位图图象
    {
    FILE *File=NULL; // 文件句柄
    if (!Filename) // 确保文件名已提供
    {
    return NULL; // 如果没提供,返回 NULL
    }
    File=fopen(Filename,"r"); // 尝试打开文件
    if (File) // 文件存在么?
    {
    fclose(File); // 关闭句柄
    return auxDIBImageLoad(Filename); // 载入位图并返回指针
    }
    return NULL; // 如果载入失败,返回 NULL
    }

    int LoadGLTextures() // 载入位图(调用上面的代码)并转换成纹理
    {
    int Status=FALSE; // 状态指示器
    AUX_RGBImageRec *TextureImage[1]; // 创建纹理的存储空间
    memset(TextureImage,0,sizeof(void *)*1); // 将指针设为 NULL

    // 载入位图,检查有无错误,如果位图没找到则退出
    if (TextureImage[0]=LoadBMP("1.bmp"))
    {
    Status=TRUE; // 将 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); // 线形滤波
    }

    if (TextureImage[0]) // 纹理是否存在
    {
    if (TextureImage[0]->data) // 纹理图像是否存在
    {
    free(TextureImage[0]->data); // 释放纹理图像占用的内存
    }

    free(TextureImage[0]); // 释放图像结构
    }
    return Status; // 返回 Status
    }

    int InitGL(GLvoid) // 此处开始对OpenGL进行所有设置
    {
    if (!LoadGLTextures()) // 调用纹理载入子例程
    {
    return FALSE; // 如果未能载入,返回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; // 初始化 OK
    }


    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); // 纹理和四边形的左上
    // 后面
    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();

    xrot+=0.3f; // X 轴旋转
    yrot+=0.2f; // Y 轴旋转
    zrot+=0.4f; // Z 轴旋转

    return TRUE; // 一切 OK
    }

  • 相关阅读:
    Oracle SQL语句大全(一)
    数据查询(3)-复杂查询(芮)
    数据查询(2)-高级查询(芮)
    数据查询(1)-简单查询(芮)
    T-SQL(5)-操作数据行(芮)
    T-SQL(4)-功能函数(芮)
    T-SQL(3)-批处理(芮)
    T-SQL(2)-逻辑控制(芮)
    T-SQL(1)-变量(芮)
    如何设计数据库(2)?(芮)
  • 原文地址:https://www.cnblogs.com/tiandsp/p/2328979.html
Copyright © 2011-2022 走看看