2015-12-20 5 views
0

Я попробовал пример QOpenGLWidget описанный здесь: https://stackoverflow.com/a/31524956/4564882QOpenGLWidget показать черный экран

, но я получаю только черный виджет. Код точно такой же. это код, связанный с 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 это код, связанный с виджетом:.

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 бинарных файлов, построенные на моей машине, я позволяю конфигурации сборки по умолчанию, поэтому он основан на Qt ANGLE, а не на рабочем столе OpenGL. В чем проблема такого поведения?

+0

Изменяется ли цвет при изменении 'glClearColor'? – BDL

+0

@BDL: да, если я укажу цвет (например, красный), он отобразит весь виджет с выбранным цветом (красный). Но это не показало мне желаемого треугольника. – ProEns08

+0

Ваш треугольник не рисуется, потому что вы используете код OpenGL 2.x, который устарел. Qt дает вам доступ к более поздним функциям OpenGL, которые вы должны использовать. Какие зависимости вы используете для функций OpenGL? – Poriferous

ответ

0

Проблема была в том, что я использую двоичные файлы Qt5, созданные по умолчанию. По умолчанию в Qt 5.5 есть «динамический» GL - - как ANGLE (ES2)

УГОЛ ((Почти Натив e Graphics Layer Engine) - это проект с открытым исходным кодом от Google. Его цель - отобразить вызовы API OpenGL ES 2.0 в DirectX 9 API.)

и Desktop backends (Desktop OpenGL), решение о том, какой из них использовать, выполняется во время выполнения.

Проблема заключается в том, что ANGLE поддерживает только OpenGL> 3.x, поэтому первый код, который я тестирую, устарел и не поддерживается ANGLE. Вторая поддерживается, поэтому она сработала.

Итак, я восстановить Qt целевой Desktop OpenGL только поддерживать свой устаревший код, используя:

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

, а затем запустить nmake, связать мое приложение с новыми двоичными файлами, и мой код работает хорошо!

0

В моем случае мой ноутбук использует внешнюю графическую карту NVIDIA. Поэтому я пошел в панель управления NVIDIA -> «Управление 3D-настройками» - «Настройки программы», а затем выбрал «высокопроизводительный» для файла .EXE. Это сработало.