Qt OpenGL教程Word格式.docx

上传人:b****4 文档编号:8244196 上传时间:2023-05-10 格式:DOCX 页数:6 大小:21.86KB
下载 相关 举报
Qt OpenGL教程Word格式.docx_第1页
第1页 / 共6页
Qt OpenGL教程Word格式.docx_第2页
第2页 / 共6页
Qt OpenGL教程Word格式.docx_第3页
第3页 / 共6页
Qt OpenGL教程Word格式.docx_第4页
第4页 / 共6页
Qt OpenGL教程Word格式.docx_第5页
第5页 / 共6页
Qt OpenGL教程Word格式.docx_第6页
第6页 / 共6页
亲,该文档总共6页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Qt OpenGL教程Word格式.docx

《Qt OpenGL教程Word格式.docx》由会员分享,可在线阅读,更多相关《Qt OpenGL教程Word格式.docx(6页珍藏版)》请在冰点文库上搜索。

Qt OpenGL教程Word格式.docx

第七课:

纹理滤波、光源和键盘控制

第八课:

融合

第九课:

在三维空间中移动位图

第十课:

载入一个三维世界并在其中移动

第十一课:

旗的效果(波动纹理)

第十二课:

显示列表

第十三课:

位图字体

第十四课:

轮廓字体

第十五课:

使用纹理映射的轮廓字体

第十六课:

看起来很棒的雾

因为本教程是从NeHe的OpenGL教程迁移过来的,代码变为Qt实现的。

所以有的课程一时还没有实现成功,所以可能有些教程是跳跃的。

因本人时间有限,所以难免有错误出现,如果您发现了这些错误,或者有什么建议,请来信指教,谢谢。

QtOpenGL的准备工作

因为Qt存在很多版本,另外它支持的平台也很多,到目前为止我只实验了几个组合,所以就先把这些列出来吧,欢迎大家补充。

Unix/X11

Linux

Qt:

自由版或者企业版都支持OpenGL模块,而专业版则不能。

我现在使用的是3.1.0自由版和企业版。

gcc:

编译器。

我现在使用的是3.2。

X:

Linux下的图形环境。

我现在使用的是4.2.0。

Mesa:

自由的OpenGL。

我现在使用的是5.0。

Windows

企业版支持OpenGL模块,而专业版则不能。

我现在使用的是3.1.0企业版。

MicrosoftVisualStudio:

我现在使用的是6.0。

创建一个OpenGL窗口

我假设您对Qt编程已经有了一定的了解,如果您还没有熟悉Qt编程,建议您先学习一下Qt编程的基础知识。

Qt中已经包含了OpenGL模块,具体情况您可以参考QtOpenGL模块的相关内容。

NeHeWidget类

这就是我们继承QGLWidget类得到的OpenGL窗口部件类。

(由nehewidget.h展开。

#include<

qgl.h>

classNeHeWidget:

publicQGLWidget

{

Q_OBJECT

因为QGLWidget类被包含在qgl.h头文件中,所以我们的类就需要包含这个头文件。

Q_OBJECT是Qt中的一个专用的宏,具体说明请参见Qt的文档。

public:

 

NeHeWidget(QWidget*parent=0,constchar*name=0,boolfs=false);

~NeHeWidget();

protected:

voidinitializeGL();

voidpaintGL();

voidresizeGL(intwidth,intheight);

因为QGLWidget类已经内置了对OpenGL的处理,就是通过对initializeGL()、paintGL()和resizeGL()这个三个函数实现的,具体情况可以参考QGLWidget类的文档。

因为我们的这个QtOpenGL教程取材于NeHeOpenGL教程,所以这里就用这个NeHeWidget类来继承QGLWidget类来使用相关OpenGL的功能。

initializeGL()是用来初始化这个OpenGL窗口部件的,可以在里面设定一些有关选项。

paintGL()就是用来绘制OpenGL的窗口了,只要有更新发生,这个函数就会被调用。

resizeGL()就是用来处理窗口大小变化这一事件的,width和height就是新的大小状态下的宽和高了,另外resizeGL()在处理完后会自动刷新屏幕。

voidkeyPressEvent(QKeyEvent*e);

这是Qt里面的鼠标按下事件处理函数。

boolfullscreen;

用来保存窗口是否处于全屏状态的变量。

};

(由nehewidget.cpp展开。

#include"

nehewidget.h"

NeHeWidget:

:

NeHeWidget(QWidget*parent,constchar*name,boolfs)

QGLWidget(parent,name)

fullscreen=fs;

保存窗口是否为全屏的状态。

setGeometry(0,0,640,480);

设置窗口的位置,即左上角为(0,0)点,大小为640*480。

setCaption("

NeHe'

sOpenGLFramework"

);

设置窗口的标题为“NeHe'

sOpenGLFramework”。

if(fullscreen)

showFullScreen();

如果fullscreen为真,那么就全屏显示这个窗口。

}

这个是构造函数,parent就是父窗口部件的指针,name就是这个窗口部件的名称,fs就是窗口是否最大化。

~NeHeWidget()

这个是析构函数。

voidNeHeWidget:

initializeGL()

glShadeModel(GL_SMOOTH);

这一行启用smoothshading(阴影平滑)。

阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑。

我将在另一个教程中更详细的解释阴影平滑。

glClearColor(0.0,0.0,0.0,0.0);

这一行设置清除屏幕时所用的颜色。

如果您对色彩的工作原理不清楚的话,我快速解释一下。

色彩值的范围从0.0到1.0。

0.0代表最黑的情况,1.0就是最亮的情况。

glClearColor后的第一个参数是红色,第二个是绿色,第三个是蓝色。

最大值也是1.0,代表特定颜色分量的最亮情况。

最后一个参数是Alpha值。

当它用来清除屏幕的时候,我们不用关心第四个数字。

现在让它为0.0。

我会用另一个教程来解释这个参数。

通过混合三种原色(红、绿、蓝),您可以得到不同的色彩。

希望您在学校里学过这些。

因此,当您使用glClearColor(0.0,0.0,1.0,0.0),您将用亮蓝色来清除屏幕。

如果您用glClearColor(0.5,0.0,0.0,0.0)的话,您将使用中红色来清除屏幕。

不是最亮(1.0),也不是最暗(0.0)。

要得到白色背景,您应该将所有的颜色设成最亮(1.0)。

要黑色背景的话,您该将所有的颜色设为最暗(0.0)。

glClearDepth(1.0);

设置深度缓存。

glEnable(GL_DEPTH_TEST);

启用深度测试。

glDepthFunc(GL_LEQUAL);

所作深度测试的类型。

上面这三行必须做的是关于depthbuffer(深度缓存)的。

将深度缓存设想为屏幕后面的层。

深度缓存不断的对物体进入屏幕内部有多深进行跟踪。

我们本节的程序其实没有真正使用深度缓存,但几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。

它的排序决定那个物体先画。

这样您就不会将一个圆形后面的正方形画到圆形上来。

深度缓存是OpenGL十分重要的部分。

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);

真正精细的透视修正。

这一行告诉OpenGL我们希望进行最好的透视修正。

这会十分轻微的影响性能。

但使得透视图看起来好一点。

这个函数中,我们对OpenGL进行所有的设置。

我们设置清除屏幕所用的颜色,打开深度缓存,启用smoothshading(阴影平滑),等等。

这个例程直到OpenGL窗口创建之后才会被调用。

paintGL()

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

清楚屏幕和深度缓存。

glLoadIdentity();

重置当前的模型观察矩阵。

这个函数中包括了所有的绘图代码。

任何您所想在屏幕上显示的东东都将在此段代码中出现。

以后的每个教程中我都会在例程的此处增加新的代码。

如果您对OpenGL已经有所了解的话,您可以在glLoadIdentity()调用之后,函数返回之前,试着添加一些OpenGL代码来创建基本的形。

如果您是OpenGL新手,等着我的下个教程。

目前我们所作的全部就是将屏幕清除成我们前面所决定的颜色,清除深度缓存并且重置场景。

我们仍没有绘制任何东东。

resizeGL(intwidth,intheight)

if(height==0)

height=1;

防止height为0。

glViewport(0,0,(GLint)width,(GLint)height);

重置当前的视口(Viewport)。

glMatrixMode(GL_PROJECTION);

选择投影矩阵。

重置投影矩阵。

gluPerspective(45.0,(GLfloat)width/(GLfloat)height,0.1,100.0);

建立透视投影矩阵。

glMatrixMode(GL_MODELVIEW);

选择模型观察矩阵。

重置模型观察矩阵。

上面几行为透视图设置屏幕。

意味着越远的东西看起来越小。

这么做创建了一个现实外观的场景。

此处透视按照基于窗口宽度和高度的45度视角来计算。

0.1,100.0是我们在场景中所能绘制深度的起点和终点。

glMatrixMode(GL_PROJECTION)指明接下来的两行代码将影响projectionmatrix(投影矩阵)。

投影矩阵负责为我们的场景增加透视。

glLoadIdentity()近似于重置。

它将所选的矩阵状态恢复成其原始状态。

调用glLoadIdentity()之后我们为场景设置透视图。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2