QT学习OpenGL序列: Hello Materials

这篇博客介绍了在QT环境中如何使用OpenGL进行材料的学习,包括头文件的引用、CPP文件的编写,展示了初步的OpenGL材料效果。
摘要由CSDN通过智能技术生成

学习OpenGL材料

(1) 头文件

 

#ifndef CRSOPENGLWIDGETMATERIALS_H
#define CRSOPENGLWIDGETMATERIALS_H

/*
 * 控件名称:Hello Materials
 *
 * 由于法线方向会在物体进行非等比例缩放时不垂直物体表面
 *
 * 注意:STD C++ Version >= C++11
 *
 * Author: hsw
 *
*/

#include <QPainter>
#include <QPaintEngine>
#include <QKeyEvent>
#include <QDebug>
#include <QCoreApplication>
#include <QOpenGLWidget>          // OpenGLWidget
#include <QOpenGLFunctions>       // OpenGL函数
#include <QOpenGLShaderProgram>
#include <QOpenGLShader>
#include <QOpenGLBuffer>
#include <QOpenGLTexture>
#include <QMatrix4x4>
#include <QTimer>


class COpenGLWidgetMaterials : public QOpenGLWidget, public QOpenGLFunctions
{
    Q_OBJECT

    enum class RS_MOUSE_PRESS_TYPE : int
    {
        RS_MOUSE_PRESS_NON = 0,
        RS_MOUSE_PRESS_LEFT   ,
        RS_MOUSE_PRESS_RIGHT  ,
        RS_MOUSE_PRESS_MID
    };

public:
    COpenGLWidgetMaterials(int mode, QWidget* parent);
    ~COpenGLWidgetMaterials();
protected:
    void initializeGL() override;
    void resizeGL(int width, int height) override;
    void paintGL() override;
protected:
    bool eventFilter(QObject *obj, QEvent *event);
    void mousePressEvent(QMouseEvent* event);
    void mouseMoveEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
    void wheelEvent(QWheelEvent* event);
signals:
    void m_openglCloseSgn();
private:
    void m_paintCubeObject();
    void m_paintCubeLight();
private:
    QWidget*    m_pParent;
private:
    QOpenGLShader*        m_pVShaderObject;       // 物体的顶点着色器
    QOpenGLShader*        m_pVShaderLight;        // 光源的顶点着色器

    QOpenGLShader*        m_pFShaderObject;       // 物体的分片着色器
    QOpenGLShader*        m_pFShaderLight;        // 光源的顶点着色器

    QOpenGLShaderProgram* m_pShaderObjectProgram; // 管理物体着色器
    QOpenGLShaderProgram* m_pShaderLightProgram;  // 管理光源着色器

    QOpenGLBuffer         m_vBufferObject;        // 物体的顶点数据缓冲对象
    QOpenGLBuffer         m_vBufferLight;         // 光源的顶点数据缓冲对象

    int                   m_vertexObjectAttr;
    int                   m_vertexObjectNormalAttr;
    int                   m_vertexLightAttr;
private:
    // 相机的参数
    QVector3D             m_cameraPos;
    QVector3D             m_cameraFront;
    QVector3D             m_cameraUp;
    QVector3D             m_cameraRight;
    float                 m_pitch;
    float                 m_yaw;
    float                 m_fov;

    // 模型变换矩阵 + 视图变换矩阵 + 投影变换矩阵
    QMatrix4x4            m_modelObjectMatrix;
    QMatrix4x4            m_modelLightMatrix;
    QMatrix3x3            m_modelObjectNormalMatrix;
    QMatrix4x4            m_viewMatrix;
    QMatrix4x4            m_projectionMatrix;

    // 鼠标相关的数据
    QPointF               m_leftMousePressPos;
    QPointF               m_rightMousePressPos;
    QPointF               m_midMousePressPos;

    QPointF               m_leftMouseMovePos;
    QPointF               m_rightMouseMovePos;
    QPointF               m_midMouseMovePos;

    RS_MOUSE_PRESS_TYPE   m_mousePressType;
    int                   m_mode;
    int                   m_timeEpoch;

    QTimer                m_timer;
};

#endif // CRSOPENGLWIDGETMATERIALS_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "copenglwidgetmaterials.h"
#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    COpenGLWidgetMaterials*  m_pRSOpenGLWidgetMaterials;
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

(2) CPP文件

#include "copenglwidgetmaterials.h"
#include <QTimer>

COpenGLWidgetMaterials::COpenGLWidgetMaterials(int mode, QWidget *parent) : QOpenGLWidget(parent)
{
    m_pParent = parent;

    QSurfaceFormat format;
    format.setDepthBufferSize(24);
    format.setStencilBufferSize(8);
    QSurfaceFormat::setDefaultForm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值