2015-07-20 2 views
7

Я пытаюсь использовать OpenGL внутри Qt с помощью QOpenGLWidget, но мне трудно найти подходящие примеры. Я новичок в OpenGL, поэтому я пытаюсь научиться его использовать, но, как я узнал, в QOpenGLWidget, похоже, не очень хорошо применяются. Прямо сейчас, все, что я хочу сделать, это сделать треугольник, чтобы начать.Как визуализировать треугольник в QOpenGLWidget?

Вот что у меня есть.

Заголовок:

namespace Ui { 
class Widget; 
} 

class Widget : public QOpenGLWidget, protected QOpenGLFunctions 
{ 
public: 
    explicit Widget(QWidget *parent = 0); 
    ~Widget(); 

protected: 
    void initializeGL(); 
    void resizeGL(int, int); 
    void paintGL(); 

private: 
    Ui::Widget *ui; 
}; 

Класс:

Widget::Widget(QWidget *parent) : 
    QOpenGLWidget(parent), 
    ui(new Ui::Widget) 
{ 
    ui->setupUi(this); 
} 

void Widget::initializeGL() 
{ 
    // Set up the rendering context, load shaders and other resources, etc.: 
    initializeOpenGLFunctions(); 
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 
} 

void Widget::resizeGL(int w, int h) 
{ 
    // Update projection matrix and other size-related settings: 
} 

void Widget::paintGL() 
{ 
    // Draw the scene: 
    glClear(GL_COLOR_BUFFER_BIT); 
} 

Widget::~Widget() 
{ 
    delete ui; 
} 

Есть ли пример, который я мог бы использовать, чтобы просто вынести базовый треугольник? Я попробовал один отсюда: https://www.khronos.org/assets/uploads/books/openglr_es_20_programming_guide_sample.pdf, но он бросил много ошибок, которые я не мог решить.

Я также не знаю, как контексты OpenGL работают в QOpenGLWidget.

* EDIT: Получается, что примеры были отдельным пакетом на моем дистрибутиве (Arch Linux). Я смог установить их, и, похоже, есть много возможностей для начала.

Благодарим за помощь!

+0

Вы пробовали изучать примеры GL (ES), которые поставляются вместе с Qt? В QOpenGLWidget нет ничего особенного. – peppe

+0

Где я могу найти эти примеры? – inefarius

+2

Они поставляются с Qt. Раздел OpenGL. http://doc.qt.io/qt-5/examples-widgets-opengl.html – peppe

ответ

19

Если вы хотите использовать QOpenGLWidget не QGLWidget, то это способ сделать это.

Открыть Qt Creator и выбрать приложение Qt Widgets. Кнопка Добавить виджет и нажимной следующим

enter image description here

main.cpp

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 

Теперь добавьте новый класс и назовите его OGLWidget, который должен наследоваться от QOpenGLWidget

oglwidget.h

#ifndef OGLWIDGET_H 
#define OGLWIDGET_H 

#include <QWidget> 
#include <QOpenGLWidget> 
#include <gl/GLU.h> 
#include <gl/GL.h> 

class OGLWidget : public QOpenGLWidget 
{ 
public: 
    OGLWidget(QWidget *parent = 0); 
    ~OGLWidget(); 

protected: 
    void initializeGL(); 
    void resizeGL(int w, int h); 
    void paintGL(); 
}; 

#endif // OGLWIDGET_H 

oglwidget.cpp

#include "oglwidget.h" 

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

Теперь вернитесь к форме и щелкните правой кнопкой мыши на виджете. Выберите продвинутые виджеты и введите номер продвинутого класса OGLWidget. Нажмите кнопку добавления, а затем продвигайте. Теперь нажмите на фон и перейдите к его свойствам и измените windowModality на ApplicationModel.

enter image description here

и это результат, который вы должны получить

enter image description here

файл .pro является

#------------------------------------------------- 
# 
# Project created by QtCreator 2015-07-20T15:15:29 
# 
#------------------------------------------------- 

QT  += core gui opengl 

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

TARGET = test2 
TEMPLATE = app 


SOURCES += main.cpp\ 
     mainwindow.cpp \ 
    oglwidget.cpp 

HEADERS += mainwindow.h \ 
    oglwidget.h 

FORMS += mainwindow.ui 
+0

Спасибо за очень подробный ответ. Однако разве glBegin и glEnd не устарели? Кроме того, требуется ли GLU? – inefarius

+0

Это простой пример. Qt имеет несколько примеров, если вы хотите получить более подробную информацию. – CroCo

+2

Это не показывает, как использовать функциональность в QOpenGLWidget. Если вы захотите использовать OpenGL, то не будет никакой цели в подклассе QOpenGLWidget, который я вижу. – steventaitinger

Смежные вопросы