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