QOpenGLWidget显示黑屏

Posted

技术标签:

【中文标题】QOpenGLWidget显示黑屏【英文标题】:QOpenGLWidget show black screen 【发布时间】:2015-12-20 13:09:26 【问题描述】:

我尝试了这里描述的 QOpenGLWidget 示例: https://***.com/a/31524956/4564882

但我只得到一个黑色小部件。代码完全相同。这是与 QopenGLWidget 相关的代码:

OGLWidget::OGLWidget(QWidget *parent)
: QOpenGLWidget(parent)
 

 

 OGLWidget::~OGLWidget()




 void OGLWidget::initializeGL()
 
   glClearColor(0,0,0,1);
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_LIGHT0);
   glEnable(GL_LIGHTING);
   glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
   glEnable(GL_COLOR_MATERIAL);


 void OGLWidget::paintGL()

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBegin(GL_TRIANGLES);
    glColor3f(1.0, 0.0, 0.0);
    glVertex3f(-0.5, -0.5, 0);
    glColor3f(0.0, 1.0, 0.0);
    glVertex3f( 0.5, -0.5, 0);
    glColor3f(0.0, 0.0, 1.0);
    glVertex3f( 0.0,  0.5, 0);
glEnd();
 

 void OGLWidget::resizeGL(int w, int h)
 
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, (float)w/h, 0.01, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0,5,0,0,0,0,1,0);
  

我在这里尝试了这个例子:https://doc.qt.io/archives/qt-5.3/qtopengl-2dpainting-example.html。它工作正常(尝试两个基类:QGLWidget 和 QOpenGLWidget。这是与 Widget 关联的代码:

  GLWidget::GLWidget(Helper *helper, QWidget *parent)
  : QGLWidget(QGLFormat(QGL::SampleBuffers), parent), helper(helper)
 
 elapsed = 0;
setFixedSize(200, 200);
setAutoFillBackground(false);


void GLWidget::animate()

 elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;
 repaint();
 

void GLWidget::paintEvent(QPaintEvent *event)

QPainter painter;
painter.begin(this);
painter.setRenderHint(QPainter::Antialiasing);
helper->paint(&painter, event, elapsed);
painter.end();

我使用在我的机器上构建的 Qt 5.5.1 二进制文件。我默认使用 Build Configuration,所以它基于 Qt ANGLE 而不是 Desktop OpenGL。 这种行为有什么问题?

【问题讨论】:

更改glClearColor时颜色会改变吗? @BDL:是的,如果我指定一种颜色(例如红色),它将显示所有具有所选颜色(红色)的小部件。但它没有显示我想要的三角形。 您的三角形未绘制,因为您使用的是已弃用的 OpenGL 2.x 代码。 Qt 使您可以访问以后应该考虑使用的 OpenGL 函数。您为 OpenGL 函数使用了哪些依赖项? 谢谢!我使用包括:#include #include #include 和 Qt5(如果我与 Qt 4.8 链接,相同的代码可以工作)。我正在链接库:Qt5OpenGLd.lib、opengl32.lib、glu32.lib。我怎么能使用这个不推荐使用的代码,因为我正在将代码从 Qt 4.8 迁移到 Qt 5.5,但我应该保持 OpenGL 小部件原样,修改时间太长。 我正在使用 Qt5 链接到 QtANGLE 头文件。如何切换到桌面 OpenGL。 【参考方案1】:

就我而言,我的笔记本电脑使用 NVIDIA 外置显卡。所以我去了 NVIDIA 控制面板 -> 管理 3D 设置 -> 程序设置,然后为 .EXE 文件选择“高性能”。这行得通。

【讨论】:

【参考方案2】:

问题是因为我使用了使用默认配置构建的 Qt5 二进制文件。 Qt 5.5 中的默认值是“动态”GL——都是 ANGLE (ES2)

ANGLE((几乎是原生图形层引擎)是一个开源项目,由 谷歌。其目的是将 OpenGL ES 2.0 API 调用映射到 DirectX 9 API。)

和桌面后端 (Desktop OpenGL) 已构建,在运行时决定使用哪一个。

问题是 ANGLE 只支持 OpenGL>3.x,所以我测试的第一个代码已被弃用,ANGLE 不支持。支持第二个,这就是它起作用的原因。

因此,我重建 Qt 以仅针对桌面 OpenGL 以支持我已弃用的​​代码,使用:

configure -debug-and-release -opensource -opengl desktop -platform win32-msvc2015

然后运行nmake,将我的应用程序链接到新的二进制文件,我的代码运行良好!

【讨论】:

知道如何用 cmake 做到这一点吗?【参考方案3】:

我的桌面出现黑屏。我通过添加这行代码解决了这个问题:

QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);

例如,放在这里:

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();

【讨论】:

感谢您指出您放置代码行的位置。在 C++ 中,这很重要。

以上是关于QOpenGLWidget显示黑屏的主要内容,如果未能解决你的问题,请参考以下文章

QOpenGLWidget纹理映射导致黑屏

Qt音视频开发24-视频显示QOpenGLWidget方式(占用GPU)

在qt的QOpenGLWidget开启opengl的抗锯齿

Qt OpenGL (QOpenGLWidget) - 简单三角形

添加到 QGraphicsScene 时如何更新 OpenGL 绘图(QOpenGLWidget)?

加不了openglwidget