MikasuSoda 2026-02-06 18:42 采纳率: 66.7%
浏览 3

系统:ubuntu2204机器:rk3588 16gb+128gbqt6.7.3使用opengles去渲染显示图片,主ui会黑屏不显示,glmark2-es运行可以看到g610显卡,如何解决?

系统:ubuntu2204
机器:rk3588 16gb+128gb
qt6.7.3使用opengles去渲染显示图片,主ui会黑屏不显示,glmark2-es运行可以看到g610显卡,去除opengl相关代码程序可以正常运行,x86 intel平台同一份代码也可以正常运行显示,请帮帮忙,看看如何解决

  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2026-02-06 18:43
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    根据你提供的信息,问题主要集中在 Ubuntu 22.04 + RK3588(ARM架构) 平台下使用 Qt6.7.3 + OpenGL ES 渲染图片时出现的黑屏现象。而 glmark2-es 可以正常运行并识别到 G610 显卡,说明 GPU 驱动和 GLES 支持是正常的。

    但是你的 Qt 程序在启用 OpenGL ES 后无法显示图像,而关闭 OpenGL 相关代码后可以正常显示,同时在 x86 平台上没有问题。这表明问题很可能出在 驱动兼容性、Qt 的 GLES 配置或显卡驱动支持上


    🔍 问题分析

    1. GLES 支持情况

    • glmark2-es 能够看到 G610 显卡,说明系统支持 OpenGL ES。
    • 但 Qt 应用程序可能没有正确初始化 GLES 上下文或渲染管线。

    2. Qt 与 GLES 的兼容性

    • Qt 6.7.3 对 OpenGL ES 的支持是有限的,尤其是对于某些特定平台(如 RK3588)。
    • 在 ARM 架构下,特别是基于 Rockchip 的芯片,可能存在 驱动兼容性问题Qt 模块未正确加载

    3. 黑屏原因可能包括:

    • GLES 上下文未正确创建
    • 渲染管线配置错误
    • 显卡驱动不支持某些 GLES 特性
    • Qt 的 GLES 模块未被正确链接或启用

    ✅ 解决方案

    第一步:确认 GLES 支持

    确保系统中安装了正确的 OpenGL ES 开发库:

    sudo apt install libgles2-mesa-dev libegl1-mesa-dev
    

    注意: 在 ARM 平台上,可能需要从官方源或第三方仓库安装适合 RK3588 的 Mesa 驱动。


    第二步:检查 Qt 的 GLES 支持

    在 Qt 项目中,确保启用了 OpenGL ES 支持。修改 .pro 文件:

    QT += opengles2
    

    或者:

    QT += opengles
    

    注意: 如果使用的是 QtQuick,可能需要使用 qtquick 模块而不是直接使用 OpenGL。


    第三步:验证 GLES 上下文是否成功创建

    在 Qt 程序中添加以下代码,检查 GLES 是否可用:

    #include <QOpenGLContext>
    #include <QDebug>
    
    void checkGLES()
    {
        QOpenGLContext context;
        if (!context.create()) {
            qDebug() << "Failed to create OpenGL context.";
        } else {
            qDebug() << "OpenGL context created successfully.";
            qDebug() << "GL_VERSION: " << reinterpret_cast<const char*>(glGetString(GL_VERSION));
            qDebug() << "GL_RENDERER: " << reinterpret_cast<const char*>(glGetString(GL_RENDERER));
        }
    }
    

    重点: 如果这个函数输出为空或报错,说明 GLES 上下文未正确初始化。


    第四步:使用 qDebug() 和日志调试

    在 Qt 程序中开启详细日志输出,查看是否有错误信息:

    QApplication::setAttribute(Qt::AA_UseOpenGLES);
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    

    注意: 在某些情况下,Qt::AA_UseOpenGLES 是必须的,尤其是在 ARM 平台上。


    第五步:尝试使用 EGL 作为渲染后端

    如果 GLES 仍然无法工作,可以尝试强制使用 EGL 渲染器:

    QSurfaceFormat format;
    format.setRenderableType(QSurfaceFormat::OpenGles);
    format.setMajorVersion(2);
    format.setMinorVersion(0);
    QSurfaceFormat::setDefaultFormat(format);
    

    第六步:替换为 QtQuick 或 QML 渲染

    如果你只是要显示图片,考虑使用 QtQuick 或 QML 来替代原生 OpenGL ES 渲染:

    import QtQuick 2.15
    import QtQuick.Window 2.15
    
    Window {
        width: 800
        height: 600
        visible: true
        color: "black"
    
        Image {
            source: "your-image.png"
            anchors.centerIn: parent
        }
    }
    

    优点: QtQuick 更稳定,对 ARM 平台支持更好,且无需手动管理 GLES 上下文。


    第七步:更新内核和驱动

    RK3588 使用的是 ARM 架构,其图形驱动通常依赖于 Linux 内核和 Mesa 驱动。请确保:

    • 内核版本 >= 5.15
    • Mesa 驱动为最新版(如 22.x)

    你可以通过以下命令更新系统:

    sudo apt update && sudo apt upgrade -y
    sudo apt install linux-image-generic-hwe-22.04
    

    建议: 安装官方提供的 Rockchip 驱动包,或联系设备厂商获取支持。


    第八步:尝试使用 glxinfo 检查 GLES 支持

    运行以下命令查看 GLES 支持情况:

    glxinfo | grep -i opengl
    

    如果看不到 GLES 信息,说明驱动或配置有问题。


    🛠️ 修改后的代码示例(Qt 中使用 OpenGL ES)

    #include <QApplication>
    #include <QOpenGLWidget>
    #include <QOpenGLFunctions>
    #include <QImage>
    #include <QPainter>
    
    class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions {
    public:
        MyGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}
    
    protected:
        void initializeGL() override {
            initializeOpenGLFunctions();
            glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        }
    
        void paintGL() override {
            glClear(GL_COLOR_BUFFER_BIT);
    
            QImage image("your-image.png");
            QPainter painter(this);
            painter.drawImage(rect(), image);
        }
    
        void resizeGL(int w, int h) override {
            glViewport(0, 0, w, h);
        }
    };
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        MyGLWidget widget;
        widget.resize(800, 600);
        widget.show();
    
        return app.exec();
    }
    

    注意: 这个示例使用了 QPainter 绘制图像,避免直接操作 GLES,更适合调试。


    ✅ 总结

    | 问题点 | 解决方法 | |--------|----------| | GLES 上下文未创建 | 使用 QOpenGLContext 检查 | | Qt 未启用 GLES 支持 | 修改 .pro 文件,添加 QT += opengles2 | | 显卡驱动不兼容 | 更新内核和 Mesa 驱动 | | 渲染管线配置错误 | 使用 QMLQtQuick 替代 | | 黑屏问题 | 检查 glGetString() 输出,确保 GLES 正常工作 |


    如果你能提供更具体的代码片段或错误日志,我可以进一步帮助你定位问题。希望以上方案能帮你解决问题!

    评论

报告相同问题?

问题事件

  • 创建了问题 2月6日