学习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