虽然Qt不以效率著称,但是事实上有足够的优化,最最典型的就是默认的图形双缓冲,按照Windows下的编程惯例是需要手动开启,并通过额外的接口调用才能使用的,这一点在以前简单图形编程学习时比较过Qt,Win32 GDI时感受特别深刻,在没有额外处理的时候,Win32动画程序那个闪阿,而Qt程序非常稳定。事实上,我想,Qt的其他问题比效率严重多了,比如个人感觉Qt程序在Windows下刷新的感知明显没有Windows原生程序快,这点倒是值得改进。
OpenGL只处理与3D图形的绘制,基本上不提供创建用户界面的功能,所以为OpenGL应用程序创建用户界面必须使用其它的图形工其包(如Motif、MFC等)。而Qt的OpenGL模块很好的解决了这个问题,它提供了一个继承自Qwidget的OpenGL部件类QGLWidget,使得该部件类能够像Qt其它部件那样使用,还可以在绘制窗口部件时直接使用OpenGL的API接口。在Qt中为OpenGL提供支持的类主要有以下几个:
-
QGLWidget:用于渲染OpenGL场景的易于使用的Qt部件。
-
QGLColormap:用于在QGLWidget中安装用户自定义的颜色图。
-
QGLContext:封装了用于OpenGL渲染的场景。
-
QGLFormat:指定OpenGL演染场景的显示模式。
-
QGLFrameBufferObject和QGLPixelBuffer分别提供了对GL帧缓冲对象和GL像素缓冲的支持。
-
QGLPaintEngine:QPaintEngine的派生类,为QPainter提供了OpenGL绘图引擎。
-
initializeGL() 注册函数,在此设置GL的渲染绘制属性、定义显示列表、载入固定纹理等初始化工作。在initializeGL()在调用paintGL()之前只被调用一次,之后不再调用。
-
paintGL() 绘制函数,在此使用OpenGL中的接口进行场景绘制,QGLWidget的paintEvent( QPaintEvent* )将会自动调用 paintGL()进行部件的显示绘制。也可在需要重绘时通过updateGL()时调用paintGL()。
-
resizeGL() 该函数用于处理当部件大小发生改变时,对OpenGL绘图管线各矩阵需要进行的操作。该函数paintGL()第一次调用之前,initializeGL()调用之后被第一次被调用, 之后每当QGLWidget的不见大小发生改变时,都将调用该函数来对视图、投影矩阵等进行相应的设置。
学习OpenGL很久了,也是时候在Qt的框架下感受一下OpenGL了,这也是学习OpenGL的好处,学习D3D的话就没有这么Happy了,事实上这也导致我老实东学西学-_-!真不知是好是坏。。。只是作为程序员的感觉,要是世界只剩下Windows,那么实在失去了太多的色彩。
这样就完成了一个利用OpenGL绘制矩形的任务,paintGL中调用的完全是普通的OpenGL函数,一如我们学过的普通OpenGL函数,没有区别。其中最主要的代码就在OpenGL::paintGL()中,这一点需要额外注意,那就是此处与普通的Qt程序是不同的,普通的Qt程序将重绘的工作放在paintEvent中进行,但是,可以想像的是,其实paintGL不过是QGLWidget中paintEvent中调用的一个虚接口,Qt可以在外面做好足够的OpenGL准备工作。initializeGL,resizeGL,paintGL 3个额外的虚接口就构成了一个简单但是强大的OpenGL框架,一如GLUT抽象出的框架及我在Win32 OpenGL学习时建立的框架一样,知道这些以后,可以将OpenGL在Qt中的编程分成两个部分,一个部分就是由initializeGL,resizeGL,paintGL三个虚接口构成的OpenGL的领域,我们可以在其中进行我们习惯的OpenGL操作,而程序的输入等其他GUI相关的处理则还是交由Qt原来的框架去完成。
OpenGL从Win32到Qt
实际上,在进行二维图形的绘制中,完全可以不使用OpenGL的原生接口而使用更为方便的QPainter。QPainter只是个API,实际的渲染是由QPaintEngine来执行的。Qt自带有QGLPaintEngine,为QPainter提供了OpenGL后台。在QGLWidget基础上创建的QPainter,自动将QGLPaintEngine作为绘画引擎。这样,任何使用此QPainter类型绘制的2D图形都会自动解析至OpenGL,间接以GL的原生接口来实现二维图形的绘制。使用QPainter而不是OpenGL命令的优势是可轻易将渲染在平台默认引擎和OpenGL之间切换。这样不仅可以充分利用二者各自的优势,同时还可以直接使用Qt二维绘图系统所提供的众多高级功能。
Qt 提供了QtOpenGL模块来支持三维图形功能的OpenGL模块。在使用QtOpengl模块时,必须在对应的工程文件(*.pro)中加入:
QT += opengl
来声明使用QtOpengl模块,以便 qmake 在利用*.pro生成编译器所需的makefile时添加所需的opengl库。
在Qt下使用创建Opengl绘图组件主要通过继承QGLWidget并重现相关绘制函数来实现,QGLWidget派生自QWidget,故绝大多数情况下QGLWidget可以像QWidget一样使用,只是使用OpenGL的函数替代QPainter实现绘制。通常通过子类化QGLWidget来实现OpenGL的使用,QGLWidget提供了三个虚函数用以重载来实现OpenGL的绘制:
可在任何需要刷新场景绘制的地方通过调用updateGL()来通知OpenGL进行重绘,但updateGL()自身不用实现。与QWidget相同,鼠标和键盘事件是通过mousePressEvent()和keyPressEvent()等事件处理函数进行处理的。要创建动画,只需启动QTimer,然后调用updateGL()。但应注意,如果需要在QGLWidget派生类之外的其他函数中进行paintGL()相同功能的绘制,需要先使用makeCurrent()接口将后面绘制的上下文对象(Context)标记为当前上下文对象(Current Context)。
如果本地OpenGL支持叠置绘制(Overlay Paint)(windows的WGL和X11的GLX都支持)QGLWidget还可以通过与前述类似的initializeOverlayGL()、resizeOverlayGL()、 paintOverlayGL()和updateOverlayGL()进行叠置层的绘制。makeoverlayCurrent()函数可以用于将叠置标记为当前上下文对象.
除了对OpenGL原生接口的支持,QGLWidget还为OpenGL在多个操作系统平台上的应用进行了浅层封装。Qt提供加载图像并将其与纹理绑定的使用功能。可使用 GLuint bindTexture(Qimage&, GLenum target, GLint format, QGLContext::BindOptions)等接口将图像与所申请的OpenGL纹理索引进行绑定,并使用 deleteTexture ( GLuint id )来删除已申请的纹理索引。Qt在内部对己与纹理绑定的像素图/图像进行跟踪,这样就可在使用相同的图像文件或像素图时重新使用纹理。由于QImage是独立于硬件的,因此可以在另一个线程中对纹理图片进行绘制,在绘制完成之后再载入OpenGL中作为纹理,而不需要OpenGL渲染线程中处理,因此可以很大幅度提高OpenGL绘图部件的响应速度。
Qt还提供了在OpenGL三维绘图场景中任意三维位置处按照给定的QFont字体格式绘制任意字符(包汉字等非ASCII码字符),大大简化了在三维场景中绘制字符的操作
原文链接:
http://blog.sina.com.cn/s/blog_a401a1ea0101elw3.html
Qt
OpenGL
Widget
Qt
OpenGL
Widget
提供了一个启动项目,用于进一步开发使用
QGL
Widget
的应用程序,
QGL
Widget
是允许使用
OpenGL
的
Qt
框架的一部分。 我将其用于我的地形生成器应用程序(当前正在开发中)。 我决定将已实现的
OpenGL
小部件的基本功能分开,以便其他人可以使用它,而不会剩下我的应用程序的其他开销。
该项目具有以下功能:
OpenGL
整合
OpenGL
场景内的基本导航,结合使用
Qt
鼠标事件进行旋转,平移和缩放
使用按钮和组合框在小部件外部进行基本导航和控制
您可以编辑项目文件以构建共享库或应用程序。
结构非常简单。 有两个小部件,第一个被嵌入到第二个中:
OpenGL
Container直接从
QGL
Widget
和
QGL
Functions继承(第二个是可选的,尽管如果不使用,则将极大地限制于您可以创建和显示的
OpenGL
)。 该组件是
OpenGL
简介
OpenGL
(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。
这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。而另一种程序接口系统是仅用于Microsoft
Win
dows上的Direct3D。
OpenGL
常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。
OpenGL
的高效实现(利用了图形加速硬件)存在于
Win
dows,部分UNIX平台
Qt
中自带
OpenGL
模块可以用来进行三维开发,下面介绍一下在
Qt
中进行
OpenGL
开发的一些简单Demo。
OpenGL
的最小图元是三角形。矩形则由两个三角形组成。通过四个顶点坐标和顶点的索引确定两个三角形,从而组成一个矩形。代码采用的是
Qt
的
Opengl
模块,管道编程采用的是GLSL语言。
在头文件中需要包含
Qt
对应的模块头文件,对应的头文件代码如下。
opengl
.h
#ifndef
OPENGL
_H
#define
OPENGL
_H
#include <
Qt
Widget
s/QWid..
在
Qt
中使用
OpenGL
,实际上时严格遵循一种代码开发框架的,在
Qt
Widget
中,需要使用
openGl
Widget
控件,并自定义类,类中还需继承 Q
OpenGL
Widget
,Q
OpenGL
Functions_3_3_Core 两个类,并将
openGl
Widget
***控件提升***为我们自定义的类,才能正常显示图形,本文将介绍最基本的框架搭建,后续即可在这个框架中不断添加代码进行
OpenGL
的深入学习。
而resiz
eGL
和paintGL会多次调用
resiz
eGL
在正常的情况下,触发的条件是,窗口大小发生变化时,resiz
eGL
被调用,之后会触发paint事件,从而调用paintGL()事件处理器。
paintGL在正常的情况下,只要你移动窗口的位置,就会马上触发paint事件,从而调用paintGL事件处理器。当然,还有窗口在隐藏和...
OpenGL
(三)之
Qt
窗口(Q
OpenGL
Widget
)
在上一篇中窗口类渲染
OpenGL
部件是基于Q
Win
dow,但在实际应用开发中比较常用的窗口是基于Q
Widget
(当然还有
Qt
Quick这里并不展开讲)。至于Q
Win
dow和Q
Widget
的联系,可以简略看一下这边博文从Q
Win
dow到Q
Widget
(
Qt
5)
Q
OpenGL
Widget
简单例子
Q
OpenGL
Widget
是一个用来渲染
OpenGL
图形的窗口组件,它继承于Q
Widget
;具体使用:
Header:
头文件: #includ
本章前言:本章讲如何利用VS和
QT
来创建一个基本的Q
OpenGL
Widget
窗口和有关联的三个核心函数,因为版本更新可能会有大同小异,但基本的不会有变换,有了
QT
的帮助,我们不需要下载
opengL
、glsl、cmake只需要下载一个
qt
和使之跟vs链接的小插件即可,注意在下载
qt
的时候,记得按照
opengl
模块(虽然这个模块免费了,但是
qt
官网并没有默认放入核心三模块中)。
作者:本教程是我基于github上著名的learn
opengl
教学Learn
OpenGL
CN和
opengl
官网Ope...
作为一个初学者,好像什么都不懂哦!但是,我感觉已经深深地刻入了我的心中,因为它在代码中真的是随处可见!我百度了一番,翻译是,真的是很可爱了!所以,庞大的就好像一个变形金刚,是组装起来的。说正经的,中的的概念是非常广泛的,它不仅是ui元素,也可以是一些功能性的组件:比如手势检测的,用于主题数据传递的等等。...
QGL
Widget
类的官方文档:http://doc.
qt
.io/
qt
-5.6/
qgl
widget
.html
主要是有如下三个函数需要重写:
class MyGLDrawer : public
QGL
Widget
Q_OBJECT // must include this if you use
Qt
signals/slots
public:
MyGLDra