Qt提供了对OpenGL的广泛支持,这对于开发需要复杂图形处理的机器视觉软件尤为重要。以下是Qt对OpenGL支持的一些关键方面:
1. 用户界面开发方法: Qt有两种主要的用户界面开发方式:Qt Quick和Qt Widgets。这两种方式都支持与OpenGL图形API的代码结合,分别基于为这两种类型的用户界面优化的独立图形引擎
2. 硬件加速3D图形: Qt支持与OpenGL实现的集成,使开发者能够在更传统的用户界面旁边显示硬件加速的3D图形。Qt提供的示例展示了在Qt应用程序中利用OpenGL的基本技术。
3. OpenGL支持类的迁移: 在Qt 5中,为了支持OpenGL这一跨平台图形API——它是Qt图形基础的一部分——向Qt Gui添加了一组替代的OpenGL支持类。在Qt 6中,这些类已经迁移到了Qt OpenGL模块。
4. OpenGL核心配置文件支持: Qt现在已经扩展了对OpenGL的支持,提供了对OpenGL核心配置文件的访问。使用核心配置文件时,移除了对传统固定功能管线的所有访问。这意味着在屏幕上绘制任何内容都需要使用glsl着色器和顶点数组或缓冲区。
5. 运行时OpenGL实现选择和加载: Qt支持在运行时选择和加载OpenGL实现。这种模式是默认的,并且可以通过在配置脚本中传递-opengl dynamic来显式请求。这种配置在构建时期没有对OpenGL实现进行硬编码的依赖或假设,因此是最灵活的。
通过这些支持,Qt能够使开发者充分利用OpenGL的强大功能,为机器视觉软件提供高性能的图形处理能力。
下面是个Qt OpenGL着色器程序例子。
创建一个完整的Qt OpenGL着色器程序涉及到几个步骤,包括设置OpenGL环境、编写GLSL着色器代码,以及将这些着色器集成到Qt应用程序中。这里提供了一个简单的例子,展示了如何编写头文件和.cpp文件来实现这一点。
首先是头文件(MyGLWidget.h):
- #ifndef MYGLWIDGET_H
- #define MYGLWIDGET_H
-
- #include
- #include
-
- class MyGLWidget : public QOpenGLWidget
- {
- Q_OBJECT
-
- public:
- MyGLWidget(QWidget *parent = nullptr);
- ~MyGLWidget();
-
- protected:
- void initializeGL() override;
- void resizeGL(int w, int h) override;
- void paintGL() override;
-
- private:
- QOpenGLShaderProgram *m_program;
- int m_vertexLocation, m_matrixLocation, m_colorLocation;
- QMatrix4x4 m_projMatrix;
- };
-
- #endif // MYGLWIDGET_H
接着是.cpp文件(MyGLWidget.cpp):
- #include "MyGLWidget.h"
-
- MyGLWidget::MyGLWidget(QWidget *parent) : QOpenGLWidget(parent), m_program(nullptr)
- {
- }
-
- MyGLWidget::~MyGLWidget()
- {
- makeCurrent();
- delete m_program;
- doneCurrent();
- }
-
- void MyGLWidget::initializeGL()
- {
- m_program = new QOpenGLShaderProgram();
- m_program->addShaderFromSourceCode(QOpenGLShader::Vertex,
- "attribute highp vec4 vertex;\n"
- "uniform highp mat4 matrix;\n"
- "void main(void)\n"
- "{\n"
- " gl_Position = matrix * vertex;\n"
- "}");
- m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,
- "uniform mediump vec4 color;\n"
- "void main(void)\n"
- "{\n"
- " gl_FragColor = color;\n"
- "}");
- m_program->link();
- m_program->bind();
-
- m_vertexLocation = m_program->attributeLocation("vertex");
- m_matrixLocation = m_program->uniformLocation("matrix");
- m_colorLocation = m_program->uniformLocation("color");
- }
-
- void MyGLWidget::resizeGL(int w, int h)
- {
- m_projMatrix.setToIdentity();
- m_projMatrix.ortho(0, w, h, 0, -1, 1);
- }
-
- void MyGLWidget::paintGL()
- {
- glClear(GL_COLOR_BUFFER_BIT);
-
- static const GLfloat triangleVertices[] = {
- 60.0f, 10.0f, 0.0f,
- 110.0f, 110.0f, 0.0f,
- 10.0f, 110.0f, 0.0f
- };
-
- QColor color(0, 255, 0, 255);
-
- m_program->enableAttributeArray(m_vertexLocation);
- m_program->setAttributeArray(m_vertexLocation, triangleVertices, 3);
- m_program->setUniformValue(m_matrixLocation, m_projMatrix);
- m_program->setUniformValue(m_colorLocation, color);
-
- glDrawArrays(GL_TRIANGLES, 0, 3);
-
- m_program->disableAttributeArray(m_vertexLocation);
- }
这个示例展示了一个Qt OpenGL小程序的基础结构,其中包括了着色器程序的初始化、配置和绘制过程。请注意,实际的应用程序可能需要更复杂的设置,包括适当的资源管理和错误处理。