#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H
#include "QtGui/QOpenGLBuffer"
#include "QtWidgets/QOpenGLWidget"
#include "QtGui/QOpenGLVertexArrayObject"
#include "QtGui/QOpenGLFunctions_4_5_Core"
class OpenGLCamera;
class QOpenGLShaderProgram;
class OpenGLWidget
: public QOpenGLWidget
, protected QOpenGLFunctions_4_5_Core
{
public:
/* @接口 默认构造函数
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月8号
*/
OpenGLWidget();
/* @接口 默认析构
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月8号
*/
~OpenGLWidget();
/* @接口
* @返回
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月8号
*/
virtual void paintGL();
/* @接口
* @返回
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月8号
*/
virtual void initializeGL();
/* @接口
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月8号
*/
virtual void resizeGL(int, int);
/* @接口
* @返回
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月17号
*/
virtual void wheelEvent(QWheelEvent *);
/* @接口
* @返回
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月17号
*/
virtual void keyPressEvent(QKeyEvent *);
/* @接口
* @返回
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月17号
*/
virtual void mouseMoveEvent(QMouseEvent *);
/* @接口
* @返回
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月17号
*/
virtual void mousePressEvent(QMouseEvent *);
/* @接口
* @返回
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月17号
*/
virtual void mouseReleaseEvent(QMouseEvent *);
private:
/* @接口
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月17号
*/
bool initShader();
/* @接口
* @类名 [OpenGLWidget]
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2021年10月17号
*/
void initOpenGLCamera();
private:
QPoint m_lastPt;
bool m_isMove = false;
OpenGLCamera *m_pCamera;
QOpenGLBuffer m_vbo, m_ebo;
QOpenGLVertexArrayObject m_vao;
QOpenGLShaderProgram *m_shaderProgram;
};
#endif /*OPENGLWIDGET_H*/
#include "openglmvp.h"
#include "openglwidget.h"
#include "openglcamera.h"
#include "QtGui/QWheelEvent"
#include "QtGui/QMouseEvent"
#include "QOpenGLShaderProgram"
const char *vertexShader =
"#version 450 core \n"
"in vec3 vPosition; \n"
"in vec3 vColor; \n"
"out vec4 outColor; \n"
"uniform mat4 gWorld; \n"
"void main() { \n"
" gl_Position = gWorld * vec4(vPosition * 0.5, 1.0); \n"
" outColor = vec4(vColor, 1.0); \n"
"} \n";
const char *fragmentShader =
"#version 450 core \n"
"in vec4 outColor; \n"
"out vec4 FragColor; \n"
"void main() { \n"
" FragColor = outColor; \n"
"} \n";
OpenGLWidget::OpenGLWidget()
: QOpenGLWidget(), m_vao()
, m_ebo(QOpenGLBuffer::IndexBuffer)
, m_vbo(QOpenGLBuffer::VertexBuffer)
{
QSurfaceFormat surfaceFormat;
surfaceFormat.setSamples(4);//多重采样
setFormat(surfaceFormat); //setFormat是QOpenGLWidget的函数
setFocusPolicy(Qt::StrongFocus);
}
OpenGLWidget::~OpenGLWidget()
{
}
void OpenGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFE