• 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):

    1. #ifndef MYGLWIDGET_H
    2. #define MYGLWIDGET_H
    3. #include
    4. #include
    5. class MyGLWidget : public QOpenGLWidget
    6. {
    7. Q_OBJECT
    8. public:
    9. MyGLWidget(QWidget *parent = nullptr);
    10. ~MyGLWidget();
    11. protected:
    12. void initializeGL() override;
    13. void resizeGL(int w, int h) override;
    14. void paintGL() override;
    15. private:
    16. QOpenGLShaderProgram *m_program;
    17. int m_vertexLocation, m_matrixLocation, m_colorLocation;
    18. QMatrix4x4 m_projMatrix;
    19. };
    20. #endif // MYGLWIDGET_H

    接着是.cpp文件(MyGLWidget.cpp):

    1. #include "MyGLWidget.h"
    2. MyGLWidget::MyGLWidget(QWidget *parent) : QOpenGLWidget(parent), m_program(nullptr)
    3. {
    4. }
    5. MyGLWidget::~MyGLWidget()
    6. {
    7. makeCurrent();
    8. delete m_program;
    9. doneCurrent();
    10. }
    11. void MyGLWidget::initializeGL()
    12. {
    13. m_program = new QOpenGLShaderProgram();
    14. m_program->addShaderFromSourceCode(QOpenGLShader::Vertex,
    15. "attribute highp vec4 vertex;\n"
    16. "uniform highp mat4 matrix;\n"
    17. "void main(void)\n"
    18. "{\n"
    19. " gl_Position = matrix * vertex;\n"
    20. "}");
    21. m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,
    22. "uniform mediump vec4 color;\n"
    23. "void main(void)\n"
    24. "{\n"
    25. " gl_FragColor = color;\n"
    26. "}");
    27. m_program->link();
    28. m_program->bind();
    29. m_vertexLocation = m_program->attributeLocation("vertex");
    30. m_matrixLocation = m_program->uniformLocation("matrix");
    31. m_colorLocation = m_program->uniformLocation("color");
    32. }
    33. void MyGLWidget::resizeGL(int w, int h)
    34. {
    35. m_projMatrix.setToIdentity();
    36. m_projMatrix.ortho(0, w, h, 0, -1, 1);
    37. }
    38. void MyGLWidget::paintGL()
    39. {
    40. glClear(GL_COLOR_BUFFER_BIT);
    41. static const GLfloat triangleVertices[] = {
    42. 60.0f, 10.0f, 0.0f,
    43. 110.0f, 110.0f, 0.0f,
    44. 10.0f, 110.0f, 0.0f
    45. };
    46. QColor color(0, 255, 0, 255);
    47. m_program->enableAttributeArray(m_vertexLocation);
    48. m_program->setAttributeArray(m_vertexLocation, triangleVertices, 3);
    49. m_program->setUniformValue(m_matrixLocation, m_projMatrix);
    50. m_program->setUniformValue(m_colorLocation, color);
    51. glDrawArrays(GL_TRIANGLES, 0, 3);
    52. m_program->disableAttributeArray(m_vertexLocation);
    53. }

    这个示例展示了一个Qt OpenGL小程序的基础结构,其中包括了着色器程序的初始化、配置和绘制过程。请注意,实际的应用程序可能需要更复杂的设置,包括适当的资源管理和错误处理。

  • 相关阅读:
    VS2019 编译Postgrsql 的windows平台代码和调试
    使用Git在GitHub上上传个人项目
    极简7照训练法,奇趣相机引领儿童AI摄影潮流
    linux用sqlcipher加解密
    什么是JavaScript(快速入门)
    Car Show
    Python 几行代码实现一键抠图,收费应用 BYEBYE
    pytorch深度学习实战lesson22
    22.11.15打卡 mysql学习笔记
    C++指针笔记
  • 原文地址:https://blog.csdn.net/exlink2012/article/details/134256298