OpenGL_Qt教程
opengl入门教程

opengl入门教程OpenGL入门教程OpenGL是一种跨平台的图形库,可用于创建各种类型的图形和视觉效果。
本教程将带你入门使用OpenGL,并介绍一些基本的概念和技术。
安装OpenGL首先,你需要安装OpenGL的开发环境。
具体安装方法将因操作系统而异,以下是一些常见操作系统的安装指南。
- Windows: 在Windows上,你可以使用MinGW或者MSYS2安装OpenGL。
- macOS: OpenGL在macOS上是默认安装的,你只需要确保你的系统版本满足OpenGL的要求。
- Linux: 在Linux上,你可以使用包管理器安装OpenGL的开发环境,如apt-get (Ubuntu)或yum (Fedora)。
创建一个OpenGL窗口在开始编写OpenGL应用程序之前,你需要创建一个OpenGL 窗口来显示你的图形。
以下是使用GLUT创建一个简单窗口的例子。
```c++#include <GL/glut.h>void display() {glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);glVertex2f(-0.5, -0.5);glVertex2f(0.5, -0.5);glVertex2f(0.0, 0.5);glEnd();glFlush();}int main(int argc, char** argv) {glutInit(&argc, argv);glutCreateWindow("OpenGL Window");glutDisplayFunc(display);glutMainLoop();return 0;}```运行上述代码,你将看到一个简单的OpenGL窗口中显示了一个三角形。
绘制基本图形OpenGL提供了一组基本的绘图函数,可用于绘制各种类型的图形。
以下是一些常见的绘图函数:- `glBegin(GL_POINTS)`: 用于绘制点。
《QTCreator快速入门》第十二章:3D绘图

《QTCreator快速⼊门》第⼗⼆章:3D绘图OpenGL是⼀套跨平台的⽤来渲染3D图形的API。
OpenGL⾃⾝是⼀个巨⼤的状态机:⼀系列的变量描述OpenGL此刻应当如何运⾏,OpenGL的状态通常被称为OpenGL上下⽂(Context)。
我们通常使⽤如下途径去更改OpenGL状态:设置选项,操作缓冲,最后,我们使⽤当前OpenGL上下⽂来渲染。
假设当我们想告诉OpenGL去画线段⽽不是三⾓形的时候,我们通过改变⼀些上下⽂变量来改变OpenGL状态,从⽽告诉OpenGL如何去绘图。
⼀旦我们改变了OpenGL的状态为绘制线段,下⼀个绘制命令就会画出线段⽽不是三⾓形。
当使⽤OpenGL的时候,我们会遇到⼀些状态设置函数,这类函数将会改变上下⽂。
以及状态使⽤函数,这类函数会根据当前OpenGL的状态执⾏⼀些操作。
⽐如下⾯例⼦中的glClearColor()函数是⼀个状态设置函数,⽽glClear()函数则是⼀个状态使⽤的函数,它使⽤了当前的状态来获取应该清除为的颜⾊。
Qt中的QtOpenGL模块提供了使⽤OpenGL的⽅法,使⽤它需要在.pro项⽬⽂件中添加QT+=opengl。
QGLWidget是QtOpenGL模块中的⼀个类,它是⼀个⽤来渲染OpenGL图形的部件,可以继承该类后来像使⽤其它QWidget部件⼀样使⽤它。
QGLWidget提供了3个虚函数重写它们来实现指定操作:initializeGL():设置OpenGL渲染环境,定义显⽰列表等,只在resizeGL()、paintGL()之前被调⽤⼀次。
resizeGL():设置OpenGL的视⼝,投影等,部件⼤⼩改变的时候被调⽤。
paintGL():渲染OpenGL场景,当部件需要更新时被调⽤。
Qt中有⼀个Hello GL⽰例程序,它在OpenGL分类中。
1、基本绘制下⾯代码使⽤QGLWidget绘制了⼀个直线、三⾓形、⽂本,其中的MyGLWidget继承⾃QGLWidget:#include <QApplication>#include "myglwidget.h"int main(int argc, char**argv){QApplication app(argc, argv);MyGLWidget w;w.resize(600, 400);w.show();return app.exec();}View Code#ifndef MYGLWIDGET_H#define MYGLWIDGET_H#include <QGLWidget>#include <GL/glu.h>class MyGLWidget: public QGLWidget{void initializeGL(){//void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);glClearColor(1.0, 0.0, 0.0, 0.0); //设置清除屏幕(glClear()⽅法)时使⽤的颜⾊为红⾊glShadeModel(GL_SMOOTH); //设置阴影平滑//void glClearDepth(GLclampd depth);glClearDepth(1.0); //设置深度缓存(深度缓冲区中每个像素需要的值)glEnable(GL_DEPTH_TEST); //启⽤深度测试功能,根据坐标的远近⾃动隐藏被遮住的图形(材料)}void resizeGL(int w, int h){//设置视⼝的⼤⼩:告诉OpenGL渲染窗⼝的尺⼨⼤⼩//也可以将视⼝的维度设置为⽐窗⼝的维度⼩,这样OpenGL渲染将会在⼀个⼩窗⼝中显⽰,这样⼦我们也可以将⼀些其它元素显⽰在OpenGL视⼝之外glViewport(0, 0, (GLint)w, (GLint)h);glMatrixMode(GL_PROJECTION); //投影矩阵模式glLoadIdentity(); //重置当前指定的矩阵为单位矩阵,这样可以将矩阵恢复到初始状态。
qopengl的使用

qopengl的使用QOpenGL是一个用于在Qt应用程序中使用OpenGL的模块。
它提供了一系列的类和函数,可以方便地进行OpenGL的初始化、渲染和交互操作。
在本文中,我们将介绍QOpenGL的使用方法和一些常见的应用场景。
我们需要在Qt项目中添加QOpenGL模块的依赖。
可以通过在.pro 文件中添加"QT += opengl"来实现。
添加完依赖后,我们就可以在代码中引入QOpenGL相关的头文件了。
QOpenGL主要提供了QWindow和QOpenGLWidget两个类来支持OpenGL的渲染。
QWindow是一个轻量级的窗口类,它提供了一个OpenGL的绘制环境。
而QOpenGLWidget则是基于QWindow的进一步封装,提供了更加方便的绘制和交互接口。
在使用QOpenGL之前,我们需要先创建一个QOpenGLContext对象,用于管理OpenGL的上下文。
然后,我们可以通过继承QWindow或QOpenGLWidget,重写其相应的虚函数来实现OpenGL的渲染。
在渲染过程中,我们可以使用QOpenGLFunctions类来调用OpenGL 的函数。
这个类提供了OpenGL ES 2.0和3.0的函数接口,并且会根据当前的OpenGL版本自动选择合适的函数。
除了渲染,QOpenGL还提供了丰富的交互功能。
比如,我们可以重写QWindow或QOpenGLWidget的鼠标和键盘事件来实现交互操作。
另外,QOpenGL还提供了一些方便的函数,如截图、保存和加载OpenGL的状态等。
QOpenGL还支持多重OpenGL上下文的共享。
这意味着我们可以在不同的窗口或线程中共享OpenGL的资源,提高了程序的性能和效率。
在实际应用中,QOpenGL被广泛应用于图形渲染、模拟和可视化等领域。
例如,我们可以使用QOpenGL来开发3D游戏、科学可视化和CAD软件等。
同时,QOpenGL也可以与其他的Qt模块结合使用,如Qt Widgets和Qt Quick。
QtCreator中的3D绘图及动画教程(参照NeHe)

QtCreator中的3D绘图及动画教程(参照NeHe)Qt Creator中的3D绘图及动画教程(参照NeHe)/cly116/article/details/47184729刚刚学习了Qt Creator,发现Qt提供了QtOpenGL模块,对OpenGL做了不错的封装,这使得我们可以很轻松地在Qt程序中使⽤OpenGL进⾏绘图渲染。
虽然⾥⾯还是由不少专业的解释照搬原⽂的,但还是加⼊了⼤量⾃⼰的分析。
⽽且Qt中写框架上⽐VC简单太多了,有不少东西都封装优化好了,代码上还是由有很多区别的。
当然,其中原教程没解释好的问题我都作了深⼊的解释,以及⼀些多余部分解释、代码都被我删掉简化了。
这份Qt OpenGL的3D绘图及动画教程,我基本会按照Nehe的OpenGL教程,只是将代码的实现运⽤到Qt Creator中,当然其中加了。
下⾯对Qt中OpenGL做⼀个简要介绍:Qt中OpenGL主要是在QGLWidget类中完成的,⽽要使⽤QtOpenGL模块,需要在项⽬⽂件( .pro)中添加代码"QT+=opengl"。
QGLWidget类是⼀个⽤来渲染OpenGL图形的部件,提供了在Qt中显⽰OpenGL图形的功能。
这个类使⽤起来很简单,只需要继承该类,然后像使⽤其他QWidget部件⼀样来使⽤它。
QGLWidget提供了3个⽅便的纯虚函数,可以在⼦类中通过重新实现它们来执⾏典型的OpenGL 任务:initializeGL():设置OpenGL渲染环境,定义显⽰列表等。
该函数只在第⼀次调⽤resizeGL()或paintGL()前被⾃动调⽤⼀次。
resizeGL():设置OpenGL的视⼝、投影等。
每次部件改变⼤⼩时都会⾃动调⽤该函数。
paintGL():渲染OpenGL场景。
每当部件需要更新时都会调⽤该函数。
(以上3个虚函数更具体的调⽤情况我会⽤另⼀篇⽂章来讲明)也就是说,Qt中当创建并显⽰出⼀个QGLWidget⼦对象时,会⾃动依次调⽤initializeGL()、resizeGL()、paintGL(),完成当前场景的绘制;⽽当某些情况发⽣时,会根据情况决定是否⾃动调⽤initializeGL()、resizeGL(),⼀旦调⽤initializeGL()、resizeGL()了,会紧跟着调⽤paintGL()对场景进⾏重新绘制。
Qt_OpenGL_教程

(由 nehewidget.cpp 展开。 ) #include "nehewidget.h" NeHeWidget::NeHeWidget( QWidget* parent, const char* name, bool fs ) : QGLWidget( parent, name ) { fullscreen = fs; 保存窗口是否为全屏的状态。 setGeometry( 0, 0, 640, 480 ); 设置窗口的位置,即左上角为(0,0)点,大小为 640*480。 setCaption( "NeHe's OpenGL Framework" ); 设置窗口的标题为“NeHe's OpenGL Framework” 。 if ( fullscreen ) showFullScreen(); 如果 fullscreen 为真,那么就全屏显示这个窗口。 } 这个是构造函数,parent 就是父窗口部件的指针,name 就是这个窗口部件的名称,fs 就是 窗口是否最大化。 NeHeWidget::~NeHeWidget() { } 这个是析构函数。 void NeHeWidget::initializeGL() { glShadeModel( GL_SMOOTH ); 这一行启用 smooth shading(阴影平滑)。阴影平滑通过多边形精细的混合色彩,并对外部光 进行平滑。我将在另一个教程中更详细的解释阴影平滑。 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 ); 所作深度测试的类型。
qtopenglwidget例子

qtopenglwidget例子qtopenglwidget是一个开源的Qt库,用于在Qt应用程序中创建OpenGL渲染窗口。
它提供了一种简单的方法来利用OpenGL进行3D图形渲染,这对于开发图形应用程序非常有用。
下面是一个简单的qtopenglwidget例子,用于在Qt中创建一个简单的3D立方体: 1. 首先,我们需要包含必要的头文件:```#include <QtOpenGL>```2. 然后,我们需要定义一个类,继承自QOpenGLWidget:```class MyOpenGLWidget : public QOpenGLWidget {Q_OBJECTpublic:MyOpenGLWidget(QWidget *parent = nullptr);protected:void initializeGL() override;void resizeGL(int w, int h) override;void paintGL() override;private:void drawCube();};```3. initializeGL()方法将在OpenGL上下文被创建时被调用。
在这个方法中,我们需要设置OpenGL的状态和参数,以及加载所需的着色器和纹理:```void MyOpenGLWidget::initializeGL() {// 设置清除颜色为黑色glClearColor(0.0f, 0.0f, 0.0f, 1.0f);// 启用深度测试glEnable(GL_DEPTH_TEST);// 创建和编译着色器// ...// 加载纹理// ...}```4. resizeGL()方法将在窗口大小发生变化时被调用。
在这个方法中,我们需要更新OpenGL的视口和投影矩阵:```void MyOpenGLWidget::resizeGL(int w, int h) {// 设置OpenGL视口glViewport(0, 0, w, h);// 更新投影矩阵// ...}```5. paintGL()方法将在每一帧渲染时被调用。
OpenGL入门教程(精)

OpenGL 入门教程1.第一课:说起编程作图,大概还有很多人想起TC 的#include < graphics.h>吧?但是各位是否想过,那些画面绚丽的PC 游戏是如何编写出来的?就靠TC 那可怜的640*480 分辨率、16 色来做吗?显然是不行的。
本帖的目的是让大家放弃TC 的老旧图形接口,让大家接触一些新事物。
OpenGL 作为当前主流的图形API 之一,它在一些场合具有比DirectX 更优越的特性。
1、与C 语言紧密结合。
OpenGL 命令最初就是用C 语言函数来进行描述的,对于学习过C 语言的人来讲,OpenGL 是容易理解和学习的。
如果你曾经接触过TC 的graphics.h,你会发现,使用OpenGL 作图甚至比TC 更加简单。
2、强大的可移植性。
微软的Direct3D 虽然也是十分优秀的图形API,但它只用于Windows 系统(现在还要加上一个XBOX 游戏机)。
而OpenGL 不仅用于Windows,还可以用于Unix/Linux 等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。
并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关。
3、高性能的图形渲染。
OpenGL 是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL 提供强力支持,激烈的竞争中使得OpenGL 性能一直领先。
总之,OpenGL 是一个很NB 的图形软件接口。
至于究竟有多NB,去看看DOOM 3 和QUAKE4 等专业游戏就知道了。
OpenGL 官方网站(英文)下面我将对Windows 下的OpenGL 编程进行简单介绍。
学习OpenGL 前的准备工作第一步,选择一个编译环境现在Windows 系统的主流编译环境有V isual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL 的。
但这里我们选择V isual Studio 2005 作为学习OpenGL 的环境。
qvtkopenglwidget 编译

要编译qvtkopenglwidget,您需要按照以下步骤进行操作:
1. 确保您已经安装了Qt 开发环境,并且版本与qvtkopenglwidget 兼容。
建议使用最新的稳定版本。
2. 下载或克隆qvtkopenglwidget 的源代码。
您可以从其官方存储库或其他可靠来源获取源代码。
3. 打开Qt Creator 或您常用的集成开发环境(IDE)。
4. 在IDE 中创建一个新的空项目或打开现有项目,以便将qvtkopenglwidget 添加到其中。
5. 将qvtkopenglwidget 的源代码添加到项目中。
这可以通过拖放文件或导入源文件来完成。
6. 在项目的.pro 文件中,确保已添加正确的模块和库依赖项。
例如,您可能需要添加类似于`QT += opengl` 的行来指定所需的OpenGL 模块。
7. 配置和构建项目。
这通常涉及选择适当的构建配置(例如Debug 或Release)并执行构建命令。
8. 如果一切顺利,构建过程将生成可执行文件或库文件,其中包含了qvtkopenglwidget。
9. 最后,您可以在您的项目中使用qvtkopenglwidget。
这可能涉及在源代码中包含必要的头文件、创建相关的对象实例并在UI 中使用它们。
请注意,具体的编译步骤可能会因您所使用的操作系统、IDE 和Qt 版本而有所不同。
确保仔细阅读qvtkopenglwidget 的文档,以获取详细的编译和集成指南。
1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Qt OpenGL教程最近一段时间除了学习Qt,翻译Qt文档之外,由于工作和兴趣的原因,开始着手看Qt OpenGL编程。
在网上搜索了有关OpenGL的教程,发现NeHe的OpenGL 教程的还很不错,作者是NeHe。
上面有很多种语言的实现,但是没有Qt和Gtk 的,所以我就想着手写这个Qt OpenGL教程,每课的内容和NeHe是一样的。
另外,介绍NeHe的一个中文翻译站点CSDN-CKer翻译的NeHe的OpenGL教程,翻译人是CKer,在我学习这个教程的过程中,给了我很大的帮助。
下面就是Qt OpenGL教程的内容:Qt OpenGL的准备工作第一课:创建一个OpenGL窗口第二课:你的第一个多边形第三课:上色第四课:旋转第五课:向三维进军第六课:纹理映射第七课:纹理滤波、光源和键盘控制第八课:融合第九课:在三维空间中移动位图第十课:载入一个三维世界并在其中移动第十一课:旗的效果(波动纹理)第十二课:显示列表第十三课:位图字体第十四课:轮廓字体第十五课:使用纹理映射的轮廓字体第十六课:看起来很棒的雾因为本教程是从NeHe的OpenGL教程迁移过来的,代码变为Qt实现的。
所以有的课程一时还没有实现成功,所以可能有些教程是跳跃的。
因本人时间有限,所以难免有错误出现,如果您发现了这些错误,或者有什么建议,请来信指教,谢谢。
Qt OpenGL的准备工作因为Qt存在很多版本,另外它支持的平台也很多,到目前为止我只实验了几个组合,所以就先把这些列出来吧,欢迎大家补充。
Unix/X11LinuxQt:自由版或者企业版都支持OpenGL模块,而专业版则不能。
我现在使用的是3.1.0自由版和企业版。
gcc:编译器。
我现在使用的是3.2。
X:Linux下的图形环境。
我现在使用的是4.2.0。
Mesa:自由的OpenGL。
我现在使用的是5.0。
WindowsQt:企业版支持OpenGL模块,而专业版则不能。
我现在使用的是3.1.0企业版。
Microsoft Visual Studio:编译器。
我现在使用的是6.0。
创建一个OpenGL窗口我假设您对Qt编程已经有了一定的了解,如果您还没有熟悉Qt编程,建议您先学习一下Qt编程的基础知识。
Qt中已经包含了OpenGL模块,具体情况您可以参考Qt OpenGL模块的相关内容。
NeHeWidget类这就是我们继承QGLWidget类得到的OpenGL窗口部件类。
(由nehewidget.h展开。
)#include <qgl.h>class NeHeWidget : public QGLWidget{Q_OBJECT因为QGLWidget类被包含在qgl.h头文件中,所以我们的类就需要包含这个头文件。
Q_OBJECT是Qt中的一个专用的宏,具体说明请参见Qt的文档。
public:NeHeWidget( QWidget* parent = 0, const char* name = 0, bool fs = false ); ~NeHeWidget();protected:void initializeGL();void paintGL();void resizeGL( int width, int height );因为QGLWidget类已经内置了对OpenGL的处理,就是通过对initializeGL()、paintGL()和resizeGL()这个三个函数实现的,具体情况可以参考QGLWidget类的文档。
因为我们的这个Qt OpenGL教程取材于NeHe OpenGL教程,所以这里就用这个NeHeWidget类来继承QGLWidget类来使用相关OpenGL的功能。
initializeGL()是用来初始化这个OpenGL窗口部件的,可以在里面设定一些有关选项。
paintGL()就是用来绘制OpenGL的窗口了,只要有更新发生,这个函数就会被调用。
resizeGL()就是用来处理窗口大小变化这一事件的,width和height就是新的大小状态下的宽和高了,另外resizeGL()在处理完后会自动刷新屏幕。
void keyPressEvent( QKeyEvent *e );这是Qt里面的鼠标按下事件处理函数。
protected:bool fullscreen;用来保存窗口是否处于全屏状态的变量。
};(由nehewidget.cpp展开。
)#include "nehewidget.h"NeHeWidget::NeHeWidget( QWidget* parent, const char* name, bool fs ) : QGLWidget( parent, name ){fullscreen = fs;保存窗口是否为全屏的状态。
setGeometry( 0, 0, 640, 480 );设置窗口的位置,即左上角为(0,0)点,大小为640*480。
setCaption( "NeHe's OpenGL Framework" );设置窗口的标题为“NeHe's OpenGL Framework”。
if ( fullscreen )showFullScreen();如果fullscreen为真,那么就全屏显示这个窗口。
}这个是构造函数,parent就是父窗口部件的指针,name就是这个窗口部件的名称,fs就是窗口是否最大化。
NeHeWidget::~NeHeWidget(){}这个是析构函数。
void NeHeWidget::initializeGL(){glShadeModel( GL_SMOOTH );这一行启用smooth shading(阴影平滑)。
阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑。
我将在另一个教程中更详细的解释阴影平滑。
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 );所作深度测试的类型。
上面这三行必须做的是关于depth buffer(深度缓存)的。
将深度缓存设想为屏幕后面的层。
深度缓存不断的对物体进入屏幕内部有多深进行跟踪。
我们本节的程序其实没有真正使用深度缓存,但几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。
它的排序决定那个物体先画。
这样您就不会将一个圆形后面的正方形画到圆形上来。
深度缓存是OpenGL十分重要的部分。
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );真正精细的透视修正。
这一行告诉OpenGL我们希望进行最好的透视修正。
这会十分轻微的影响性能。
但使得透视图看起来好一点。
}这个函数中,我们对OpenGL进行所有的设置。
我们设置清除屏幕所用的颜色,打开深度缓存,启用smooth shading(阴影平滑),等等。
这个例程直到OpenGL 窗口创建之后才会被调用。
void NeHeWidget::paintGL(){glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );清楚屏幕和深度缓存。
glLoadIdentity();重置当前的模型观察矩阵。
}这个函数中包括了所有的绘图代码。
任何您所想在屏幕上显示的东东都将在此段代码中出现。
以后的每个教程中我都会在例程的此处增加新的代码。
如果您对OpenGL已经有所了解的话,您可以在glLoadIdentity()调用之后,函数返回之前,试着添加一些OpenGL代码来创建基本的形。
如果您是OpenGL新手,等着我的下个教程。
目前我们所作的全部就是将屏幕清除成我们前面所决定的颜色,清除深度缓存并且重置场景。
我们仍没有绘制任何东东。
void NeHeWidget::resizeGL( int width, int height ){if ( height == 0 ){height = 1;}防止height为0。
glViewport( 0, 0, (GLint)width, (GLint)height );重置当前的视口(Viewport)。
glMatrixMode( GL_PROJECTION );选择投影矩阵。
glLoadIdentity();重置投影矩阵。
gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );建立透视投影矩阵。
glMatrixMode( GL_MODELVIEW );选择模型观察矩阵。
glLoadIdentity();重置模型观察矩阵。
}上面几行为透视图设置屏幕。
意味着越远的东西看起来越小。
这么做创建了一个现实外观的场景。
此处透视按照基于窗口宽度和高度的45度视角来计算。
0.1,100.0是我们在场景中所能绘制深度的起点和终点。
glMatrixMode(GL_PROJECTION)指明接下来的两行代码将影响projection matrix (投影矩阵)。
投影矩阵负责为我们的场景增加透视。
glLoadIdentity()近似于重置。
它将所选的矩阵状态恢复成其原始状态。
调用glLoadIdentity()之后我们为场景设置透视图。
glMatrixMode(GL_MODELVIEW)指明任何新的变换将会影响modelview matrix (模型观察矩阵)。
模型观察矩阵中存放了我们的物体讯息。
最后我们重置模型观察矩阵。
如果您还不能理解这些术语的含义,请别着急。