Qt、OpenGL和3D图形程序开发

本文摘自:使用qt和OpenGL开发跨平台可视化UI

科学可视化、医学成像、飞行模拟、流程建模、动画、游戏和视觉效果应用程序都需要大量使用高性能 2D 和 3D 图形。标准的图形 API(如 OpenGL® )非常适合渲染复杂的图形,但对用户界面编程却没有提供太多支持,无法满足多样化的市场。

OpenGL 和 Direct3D 都是低级图形 API。应用程序无论使用哪一个,都必须以非常原生的方式告诉计算机如何绘制画面,如点、线和多边形。例如,要绘制一个立方体,就必须要指定立方体的八个边。实在不敢想象使用这样初级的 API 渲染诸如餐桌这样复杂的事物会是什么样。此外,这些 API 还必须按顺序调用函数,这就会非常容易出错。因此,支持面向对象的 3D 可视化的高级 API 就应运而生。有了高级 API,程序员就可以定义一个场景(场景图形 API),然后在场景中放置对象。 

Qt 开发人员可使用 OpenGL 在 GUI 应用程序中绘制 3D 图形。Qt 提供了单独的 Qt OpenGL 模块,可将 OpenGL 图像与本地窗口系统集成在一起。 要将 OpenGL 配合 Qt 使用,要继承 QGLWidget。下面代码中演示的 QGLWidget 的主要功能如下:

  • 调用 initializeGL() 来初始化 GL 环境。Qt 提供了易用的函数(如 qglClearColor 和 qglColor),可将 QColor
    转换为 gl color。

  • 在重新调整 widget 大小时调用 resizeGL()。可以调整视角,然后进行相应变换。 

  • 在 OpenGL widget 需要更新时调用 paintGL()。

class GLWidget : public QGLWidget 
 
{ 
 
public: 
 
GLWidget(QWidget *parent = 0) : QGLWidget(parent)
 
{ 
}
setFormat(QGL::DoubleBuffer | QGL::DepthBuffer);
protected: 
 
void initializeGL()
 
{ 
}
qglClearColor(Qt::white);
void resizeGL(int w, int h)
 
{ 
glViewport(0, 0, w, h);
 
// setup project matrix
}
void paintGL()
 
{ 
};
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
// draw using gl

QGLWidget 的使用方式与普通的 QWidget 相似。可创建多个 QGLWidget 并将其以指定大小放置在布局中。鼠
标和键盘事件可通过 mousePressEvent() 和 keyPressEvent() 进行处理(如同 QWidget)。要创建动画,只需
启动 QTimer,然后调用 updateGL()。

QGLFrameBufferObject 和 QGLPixelBuffer 分别提供了对 GL 帧缓冲对象和 GL 像素缓冲的支持。

Qt  提供加载图像并将其与纹理绑定的易用功能。例如,以下代码加载了图像并将其与纹理绑定> 

texture = bindTexture(QPixmap(QString("image.png”)), GL_TEXTURE_2D);

Qt 在内部对己与纹理绑定的像素图/图像进行跟踪,这样就可在使用相同的图像文件或像素图时重新使用纹理。
 
可使用 renderPixmap() 将当前场景渲染为像素图。帧缓冲的内容可使用 grabFrameBuffer() 进行捕获。
renderPixmap() 和 grabFrameBuffer() 的主要差别就是使用 renderPixmap() 时不捕捉叠置。


你可能感兴趣的:(Qt、OpenGL和3D图形程序开发)