1. 程式人生 > >Qt Opengl-widget-base

Qt Opengl-widget-base

Qt當前的opengl的模組封裝,只需要gui,widgets兩大模組。而quick中,quick模組中的QQuickItem和QQuickWindow。

本節先說widget,QOpenglWidget為我們提供顯示的ui,可當傳統的widget使用,需要我們處理其opengl初始化,繪製,resize,

當然也可方便使用傳統widget的其他事件。

class OpenglWidget: public QOpenGLWidget, protected QOpenGLFunctions
{

public:
    OpenglWidget(QWidget *parent = nullptr);
    ~OpenglWidget();

    void initializeGL(){
        // 關鍵 這樣就可呼叫opengl系列方法
        initializeOpenGLFunctions();
        // initData
        // viewMat?
    }
    void paintGL(){
        // 成員渲染
    }
    void resizeGL(int w, int h){
        // 視口
        // 投影
    }

    // 其他事件
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *e);
    void wheelEvent(QWheelEvent * event);
    void keyPressEvent(QKeyEvent *e);

.....
對於我們要渲染的item,就需要QOpenGLFunctions,保護繼承即可。
class BaseRender : public QObject, protected QOpenGLFunctions
{
    Q_OBJECT
public:
    BaseRender(QObject *parent = nullptr);
    virtual ~BaseRender(){}

    virtual void render(QMatrix4x4 vpmat){Q_UNUSED(vpmat)}
private:
    virtual void initVertex(){}
    virtual void initBuffer(){}
    virtual void initShader(){}

public:
    // 頂點資料org
    QVector <QVector3D> vertexVec;
    // 頂點buffer,即VBO,EBO
    QOpenGLBuffer m_buffer;
    // 著色器程式
    QOpenGLShaderProgram *m_shaderPro;

};