NeHe教程Qt实现——lesson16
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相关推荐
- NeHe教程Qt实现——lesson01
NeHe 系列教程之一: 创建一个OpenGL 窗口 英文教程地址: lesson01 在Qt的实现中, 我们主要依赖QGLWidget类, 我们主要重载三个重要方法 : void initi ...
- NeHe教程Qt实现——lesson10
NeHe 系列教程之十:在3D空间中漫游 英文教程地址:lesson10 本课演示了从外部文件中加载数据构建3D模型的实例,代码基于第一课. 首先是3D模型的数据结构定义: namespace {bo ...
- NeHe教程Qt实现——lesson07
NeHe 系列教程之七: 光照及纹理过滤 英文教程地址:lesson07 本课将以第一课的代码为基础, 实现光照效果. 首先是对象定义与纹理加载的代码: namespace { bool light; ...
- NeHe教程Qt实现——lesson08
NeHe 系列教程之八: 混合 英文教程地址:lesson08 本课将在第七课的基础上添加颜色混合的代码: namespace { ... bool blend; // Blending OFF/ON ...
- NeHe教程Qt实现——lesson09
NeHe 系列教程之九: 在3D空间中移动位图 英文教程地址:lesson09 本课基于第一课的代码, 利用颜色混合的方法,将一个黑白纹理与随机颜色进行混合,产生绚丽的效果. 首先是定义相关变量和数据 ...
- NeHe教程Qt实现——lesson06
NeHe 系列教程之六: 纹理映射 英文教程地址:lesson06 本课以第一课的代码为基础,演示了加载纹理的过程. 首先给出的是绘制几何对象和加载纹理坐标的代码 namespace {GLfloat ...
- NeHe教程Qt实现——lesson15
NeHe 系列教程之十四:纹理 轮廓字体 英文教程地址:lesson15 本课展示如何创建和显示纹理轮廓字体, 代码基于第一课. 首先是字体库的创建: namespace {#define USE_D ...
- NeHe教程Qt实现——lesson13
NeHe 系列教程之十三: 位图字体 英文教程地址:lesson13 本课将展示位图字体的创建和显示, 代码基于第一课. 首先是字休库的创建,如下所示: namespace {#define USE_ ...
- NeHe教程Qt实现——lesson14
NeHe 系列教程之十四: 轮廓字体 英文教程地址:lesson14 本课展示如何创建和显示轮廓字体,即带有尝试的字体,可沿Z轴旋转和移动, 代码基于第一课. 同前一课类似,首先也是要创建字体库以及对 ...
最新文章
- redux logic_Redux-Logic简介
- ms sql 索引(一)
- JSP中实现网页访问统计的方法
- CSS内容溢出时,显示省略号
- 360加固分析(一)
- 这是高手最常用的第一快捷组合键 - imsoft.cnblogs
- 守护线程与非守护线程
- js处理倒计时,日期可以是当前日期也可以传1个时间点
- 织梦个人空间中调用ip,会员类型,邮箱,金币,会员积分
- Ubuntu 16.04升级Linux内核为4.7.0最快的方法
- php 复制一张图片,PHP 生成一张图片的两种方法
- 平面设计论文要如何写?
- 传递闭包c语言算法解析,找关系的传递闭包 用c语言编 一个关系的传递闭包
- mysql 数字正则_mysql 正则
- ## 关于时下新兴的日常图片视频摄像防抖技术的简单介绍与讨论
- OpenCV 对象跟踪
- AppCan:打造成云生态的移动PaaS平台
- 百度地图 公交线路查询
- AutoCAD 2008 简体中文精简版(适合低配置电脑)
- Vue引入element组件