QOpenGLWidget显示黑屏

时间:2015-12-20 13:09:26

标签: c++ qt opengl

我尝试了这里描述的QOpenGLWidget示例: https://stackoverflow.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 binairies。我默认使用Build Configuration,因此它基于Qt ANGLE而不是Desktop OpenGL。 这种行为有什么问题?

3 个答案:

答案 0 :(得分:0)

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

  

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

构建了

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

问题是ANGLE仅支持OpenGL&gt; 3.x,因此我测试的第一个代码已弃用且ANGLE不支持。第二个是受支持的,这就是它起作用的原因。

所以,我重建Qt以仅使用Desktop OpenGL来支持我弃用的代码,使用:

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

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

答案 1 :(得分:0)

在我的情况下,我的笔记本电脑使用NVIDIA外置显卡。所以我去了NVIDIA控制面板 - &gt;管理3D设置 - &gt;程序设置,然后为.EXE文件选择“高性能”。这很有用。

答案 2 :(得分:0)

我在台式机上出现黑屏。我通过添加以下代码行解决了该问题:

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();
}