OpenGL_Qt教程

合集下载

opengl入门教程

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绘图

《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的使用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)

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_教程

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例子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入门教程(精)

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 编译

要编译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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 (模型观察矩阵)。

模型观察矩阵中存放了我们的物体讯息。

最后我们重置模型观察矩阵。

如果您还不能理解这些术语的含义,请别着急。

相关文档
最新文档