NeHe 系列教程之六: 纹理映射

英文教程地址:lesson06

本课以第一课的代码为基础,演示了加载纹理的过程。

首先给出的是绘制几何对象和加载纹理坐标的代码

namespace {GLfloat     xrot = 0;             // X Rotation ( NEW )GLfloat     yrot = 0;             // Y Rotation ( NEW )GLfloat     zrot = 0;             // Z Rotation ( NEW )GLuint      texture[1];       // Storage For One Texture ( NEW )QVector<QVector3D> vertices;QVector<QVector2D> texCoords;void makeObject(){vertices<<QVector3D(-1.0f, -1.0f,  1.0f)<<QVector3D(1.0f, -1.0f,  1.0f)<<QVector3D(1.0f,  1.0f,  1.0f)<<QVector3D(-1.0f,  1.0f,  1.0f)<<QVector3D(-1.0f, -1.0f, -1.0f)<<QVector3D(-1.0f,  1.0f, -1.0f)<<QVector3D(1.0f,  1.0f, -1.0f)<<QVector3D(1.0f, -1.0f, -1.0f)<<QVector3D(-1.0f,  1.0f, -1.0f)<<QVector3D(-1.0f,  1.0f,  1.0f)<<QVector3D(1.0f,  1.0f,  1.0f)<<QVector3D(1.0f,  1.0f, -1.0f)<<QVector3D(-1.0f, -1.0f, -1.0f)<<QVector3D(1.0f, -1.0f, -1.0f)<<QVector3D(1.0f, -1.0f,  1.0f)<<QVector3D(-1.0f, -1.0f,  1.0f)<<QVector3D(1.0f, -1.0f, -1.0f)<<QVector3D(1.0f,  1.0f, -1.0f)<<QVector3D(1.0f,  1.0f,  1.0f)<<QVector3D(1.0f, -1.0f,  1.0f)<<QVector3D(-1.0f, -1.0f, -1.0f)<<QVector3D(-1.0f, -1.0f,  1.0f)<<QVector3D(-1.0f,  1.0f,  1.0f)<<QVector3D(-1.0f,  1.0f, -1.0f);texCoords<<QVector2D(0.0f, 0.0f)<<QVector2D(1.0f, 0.0f)<<QVector2D(1.0f, 1.0f)<<QVector2D(0.0f, 1.0f)<<QVector2D(1.0f, 0.0f)<<QVector2D(1.0f, 1.0f)<<QVector2D(0.0f, 1.0f)<<QVector2D(0.0f, 0.0f)<<QVector2D(0.0f, 1.0f)<<QVector2D(0.0f, 0.0f)<<QVector2D(1.0f, 0.0f)<<QVector2D(1.0f, 1.0f)<<QVector2D(1.0f, 1.0f)<<QVector2D(0.0f, 1.0f)<<QVector2D(0.0f, 0.0f)<<QVector2D(1.0f, 0.0f)<<QVector2D(1.0f, 0.0f)<<QVector2D(1.0f, 1.0f)<<QVector2D(0.0f, 1.0f)<<QVector2D(0.0f, 0.0f)<<QVector2D(0.0f, 0.0f)<<QVector2D(1.0f, 0.0f)<<QVector2D(1.0f, 1.0f)<<QVector2D(0.0f, 1.0f);glVertexPointer(3, GL_FLOAT, 0, vertices.constData());glTexCoordPointer(2, GL_FLOAT, 0, texCoords.constData());}void drawObject(){glEnableClientState(GL_VERTEX_ARRAY);glEnableClientState(GL_TEXTURE_COORD_ARRAY);glDrawArrays(GL_QUADS, 0, vertices.size());glDisableClientState(GL_VERTEX_ARRAY);glDisableClientState(GL_TEXTURE_COORD_ARRAY);}
}

然后是加载纹理的代码,该方法在头文件中声明:

void MyGLWidget::loadTextures()
{texture[0] = bindTexture(QString(":/NeHe.bmp"),GL_TEXTURE_2D,GL_RGBA);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear FilteringglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering
}

初始化代码:

void MyGLWidget::initializeGL()
{makeObject();loadTextures();glEnable(GL_TEXTURE_2D);    // Enable Texture Mapping ( NEW )glShadeModel(GL_SMOOTH);   // Enables Smooth ShadingglClearColor(0.0f, 0.0f, 0.0f, 0.5f);  // Black BackgroundglClearDepth(1.0f);             // Depth Buffer SetupglEnable(GL_DEPTH_TEST);        // Enables Depth TestingglDepthFunc(GL_LEQUAL);        // The Type Of Depth Test To DoglHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
}

最后,是实际的绘制代码:

void MyGLWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // Clear The Screen And The Depth BufferglLoadIdentity();       // Reset The Current Modelview MatrixglTranslatef(0.0f,0.0f,-5.0f);       // Move Into The Screen 5 UnitsglRotatef(xrot,1.0f,0.0f,0.0f);     // Rotate On The X AxisglRotatef(yrot,0.0f,1.0f,0.0f);   // Rotate On The Y AxisglRotatef(zrot,0.0f,0.0f,1.0f);       // Rotate On The Z AxisglBindTexture(GL_TEXTURE_2D, texture[0]);       // Select Our TexturedrawObject();xrot += 0.3f;                             // X Axis Rotationyrot += 0.2f;                             // Y Axis Rotationzrot += 0.4f;                             // Z Axis Rotation
}

实际运行效果如下所示:

转载于:https://my.oschina.net/fuyajun1983cn/blog/263786

NeHe教程Qt实现——lesson06相关推荐

  1. NeHe教程Qt实现——lesson01

    NeHe 系列教程之一: 创建一个OpenGL 窗口 英文教程地址: lesson01 在Qt的实现中, 我们主要依赖QGLWidget类, 我们主要重载三个重要方法 :     void initi ...

  2. NeHe教程Qt实现——lesson10

    NeHe 系列教程之十:在3D空间中漫游 英文教程地址:lesson10 本课演示了从外部文件中加载数据构建3D模型的实例,代码基于第一课. 首先是3D模型的数据结构定义: namespace {bo ...

  3. NeHe教程Qt实现——lesson07

    NeHe 系列教程之七: 光照及纹理过滤 英文教程地址:lesson07 本课将以第一课的代码为基础, 实现光照效果. 首先是对象定义与纹理加载的代码: namespace { bool light; ...

  4. NeHe教程Qt实现——lesson08

    NeHe 系列教程之八: 混合 英文教程地址:lesson08 本课将在第七课的基础上添加颜色混合的代码: namespace { ... bool blend; // Blending OFF/ON ...

  5. NeHe教程Qt实现——lesson09

    NeHe 系列教程之九: 在3D空间中移动位图 英文教程地址:lesson09 本课基于第一课的代码, 利用颜色混合的方法,将一个黑白纹理与随机颜色进行混合,产生绚丽的效果. 首先是定义相关变量和数据 ...

  6. NeHe教程Qt实现——lesson16

    NeHe 系列教程之十四:雾 英文教程地址:lesson16 本课展示产生雾. 相关变量和函数定义: namespace { bool gp; GLuint fogMode[] = { GL_EXP, ...

  7. NeHe教程Qt实现——lesson15

    NeHe 系列教程之十四:纹理 轮廓字体 英文教程地址:lesson15 本课展示如何创建和显示纹理轮廓字体, 代码基于第一课. 首先是字体库的创建: namespace {#define USE_D ...

  8. NeHe教程Qt实现——lesson13

    NeHe 系列教程之十三: 位图字体 英文教程地址:lesson13 本课将展示位图字体的创建和显示, 代码基于第一课. 首先是字休库的创建,如下所示: namespace {#define USE_ ...

  9. NeHe教程Qt实现——lesson14

    NeHe 系列教程之十四: 轮廓字体 英文教程地址:lesson14 本课展示如何创建和显示轮廓字体,即带有尝试的字体,可沿Z轴旋转和移动, 代码基于第一课. 同前一课类似,首先也是要创建字体库以及对 ...

最新文章

  1. base64报错与已下载模块,但import失败解决
  2. Ubuntu创始人谈Windows 7、Chrome OS
  3. python学习-综合练习四(最大公约数、最小公倍数、生成日历、递归调用、字符串)
  4. [RabbitMQ]工作队列原理_代码实现
  5. OpenGL基础22:贴图
  6. 计算机设计大赛无人车挑战赛
  7. 通过路径传值id进行页面判断
  8. 乌班图服务器系统网卡驱动,Linux_Ubuntu系统无法衔接网络 该怎样安装无线网卡驱动?,ubuntu已经很好的兼容了主流的 - phpStudy...
  9. Navicat for mac破解版
  10. 单舵轮(叉车)AGV里程计数据解算
  11. 8cm等于多少像素_厘米与像素一张图片,要打印尺寸为10.8厘米*17厘米,图片要编 爱问知识人...
  12. linux 学习决心书
  13. 11_传智播客iOS视频教程_NS前缀和@符号
  14. 手把手教你用Python采集腾讯招聘数据
  15. 地下迷宫探索 java_Java 8:探索可能性
  16. 手机淘宝构架演化实践
  17. 太极图用html做的原理,用HTML画个太极图
  18. vue3 后台返回的图片链接如何查看与下载
  19. python的list合并
  20. 关于dedecms织梦后台html编辑器不能复制word格式的处理方法/ kindEditor编辑器/百度(ueditor)编辑器的添加方法

热门文章

  1. SimplifiedHibernate:简化了的Hibernate
  2. React: 关于React通信方式
  3. Android应用实例收藏管理
  4. Nginx 从零搭建
  5. Vue_VueRouter
  6. python基础知识和运用
  7. 安装Oracle 10g sys,system 密码忘记设置解决办法
  8. 单件模式Singleton Pattern
  9. Tomcat6.0的JNDI使用方法(连接池)
  10. Table布局及其它布局