Qt对Opengl的支持情况

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 <QOpenGLWidget>
#include <QOpenGLShaderProgram>

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小程序的基础结构,其中包括了着色器程序的初始化、配置和绘制过程。请注意,实际的应用程序可能需要更复杂的设置,包括适当的资源管理和错误处理。