NeHe 系列教程之十四:雾

英文教程地址:lesson16

本课展示产生雾。

相关变量和函数定义:

namespace {
bool    gp;
GLuint  fogMode[] = { GL_EXP, GL_EXP2, GL_LINEAR };
GLuint  fogfilter = 0;
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f};      // Fog Color
bool    light;                       // Lighting ON / OFF
bool    lp;                         // L Pressed?
bool    fp;                         // F Pressed?
GLfloat xrot;                       // X Rotation
GLfloat yrot;                       // Y Rotation
GLfloat xspeed;                     // X Rotation Speed
GLfloat yspeed;                     // Y Rotation Speed
GLfloat z=-5.0f;                    // Depth Into The ScreenGLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };             // Ambient Light Values ( NEW )
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };              // Diffuse Light Values ( NEW )
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };            // Light Position ( NEW )
GLuint  filter;                                 // Which Filter To Use
GLuint  texture[3];                             // Storage for 3 texturesQVector<QVector3D> vertices;
QVector<QVector2D> texCoords;
QVector<QVector3D> normals;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);normals<<QVector3D(0.0f, 0.0f, 1.0f)<<QVector3D(0.0f, 0.0f, 1.0f)<<QVector3D(0.0f, 0.0f, 1.0f)<<QVector3D(0.0f, 0.0f, 1.0f)<<QVector3D(0.0f, 0.0f,-1.0f)<<QVector3D(0.0f, 0.0f,-1.0f)<<QVector3D(0.0f, 0.0f,-1.0f)<<QVector3D(0.0f, 0.0f,-1.0f)<<QVector3D(0.0f, 1.0f, 0.0f)<<QVector3D(0.0f, 1.0f, 0.0f)<<QVector3D(0.0f, 1.0f, 0.0f)<<QVector3D(0.0f, 1.0f, 0.0f)<<QVector3D(0.0f, -1.0f, 0.0f)<<QVector3D(0.0f, -1.0f, 0.0f)<<QVector3D(0.0f, -1.0f, 0.0f)<<QVector3D(0.0f, -1.0f, 0.0f)<<QVector3D(1.0f, 0.0f, 0.0f)<<QVector3D(1.0f, 0.0f, 0.0f)<<QVector3D(1.0f, 0.0f, 0.0f)<<QVector3D(1.0f, 0.0f, 0.0f)<<QVector3D(-1.0f, 0.0f, 0.0f)<<QVector3D(-1.0f, 0.0f, 0.0f)<<QVector3D(-1.0f, 0.0f, 0.0f)<<QVector3D(-1.0f, 0.0f, 0.0f);glVertexPointer(3, GL_FLOAT, 0, vertices.constData());glTexCoordPointer(2, GL_FLOAT, 0, texCoords.constData());glNormalPointer(GL_FLOAT, 0, normals.constData());}void drawObject()
{glEnableClientState(GL_VERTEX_ARRAY);glEnableClientState(GL_TEXTURE_COORD_ARRAY);glEnableClientState(GL_NORMAL_ARRAY);glBindTexture(GL_TEXTURE_2D, texture[filter]);glDrawArrays(GL_QUADS, 0, vertices.size());glDisableClientState(GL_VERTEX_ARRAY);glDisableClientState(GL_TEXTURE_COORD_ARRAY);glDisableClientState(GL_NORMAL_ARRAY);
}
}

初始化:

void MyGLWidget::initializeGL()
{makeObject();loadTextures();glEnable(GL_TEXTURE_2D);    // Enable Texture MappingglShadeModel(GL_SMOOTH);   // Enables Smooth ShadingglClearColor(0.5f,0.5f,0.5f,1.0f);  // 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 CalculationsglLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);             // Setup The Ambient LightglLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);            // Position The LightglEnable(GL_LIGHT1);                            // Enable Light OneglFogi(GL_FOG_MODE, fogMode[fogfilter]);        // Fog ModeglFogfv(GL_FOG_COLOR, fogColor);            // Set Fog ColorglFogf(GL_FOG_DENSITY, 0.35f);              // How Dense Will The Fog BeglHint(GL_FOG_HINT, GL_DONT_CARE);          // Fog Hint ValueglFogf(GL_FOG_START, 1.0f);             // Fog Start DepthglFogf(GL_FOG_END, 5.0f);               // Fog End DepthglEnable(GL_FOG);                   // Enables GL_FOG
}

按键处理:

void MyGLWidget::keyPressEvent(QKeyEvent *e)
{switch (e->key()) {case Qt::Key_I:if (!fp) {fp = true;filter += 1;if (filter > 2)filter = 0;}break;case Qt::Key_G:if (!gp) {gp = true;fogfilter += 1;if (fogfilter > 2)fogfilter = 0;glFogi (GL_FOG_MODE, fogMode[fogfilter]);}break;case Qt::Key_F:fullscreen = !fullscreen;if (fullscreen) {showFullScreen();} else {resize(640, 480);showNormal();}break;case Qt::Key_L:if (!lp) {lp=true;                // lp Becomes TRUElight=!light;               // Toggle Light TRUE/FALSEif (!light)             // If Not Light{glDisable(GL_LIGHTING);     // Disable Lighting}else                    // Otherwise{glEnable(GL_LIGHTING);      // Enable Lighting}}break;case Qt::Key_PageUp:z -= 0.02f;break;case Qt::Key_PageDown:z += 0.02f;break;case Qt::Key_Up:xspeed -= 0.01f;break;case Qt::Key_Down:xspeed += 0.01f;break;case Qt::Key_Right:yspeed += 0.01f;break;case Qt::Key_Left:yspeed -= 0.01f;break;case Qt::Key_Escape:QMessageBox::StandardButton reply;reply = QMessageBox::question(NULL, "NeHe","Do you want to exit?",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes);if (reply == QMessageBox::Yes) {qApp->quit();}break;default:QGLWidget::keyPressEvent(e);break;}
}

运行效果:

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

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

  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实现——lesson06

    NeHe 系列教程之六: 纹理映射 英文教程地址:lesson06 本课以第一课的代码为基础,演示了加载纹理的过程. 首先给出的是绘制几何对象和加载纹理坐标的代码 namespace {GLfloat ...

  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. redux logic_Redux-Logic简介
  2. ms sql 索引(一)
  3. JSP中实现网页访问统计的方法
  4. CSS内容溢出时,显示省略号
  5. 360加固分析(一)
  6. 这是高手最常用的第一快捷组合键 - imsoft.cnblogs
  7. 守护线程与非守护线程
  8. js处理倒计时,日期可以是当前日期也可以传1个时间点
  9. 织梦个人空间中调用ip,会员类型,邮箱,金币,会员积分
  10. Ubuntu 16.04升级Linux内核为4.7.0最快的方法
  11. php 复制一张图片,PHP 生成一张图片的两种方法
  12. 平面设计论文要如何写?
  13. 传递闭包c语言算法解析,找关系的传递闭包 用c语言编 一个关系的传递闭包
  14. mysql 数字正则_mysql 正则
  15. ## 关于时下新兴的日常图片视频摄像防抖技术的简单介绍与讨论
  16. OpenCV 对象跟踪
  17. AppCan:打造成云生态的移动PaaS平台
  18. 百度地图 公交线路查询
  19. AutoCAD 2008 简体中文精简版(适合低配置电脑)
  20. Vue引入element组件

热门文章

  1. C语言自学《八》---- C语言知识总结
  2. Python语言的有限状态机实现样例
  3. CentOS下安装JDK的三种方法
  4. PostgreSQL schemaless 的实现(类mongodb collection)
  5. 第四次作业 孙保平034 李路平029
  6. 使用 libevent 和 libev 提高网络应用性能
  7. Android 线程管理
  8. Tomcat6.0的JNDI使用方法(连接池)
  9. self = [super init]
  10. VC++学习(17):进程间通信