QOpenGLWidget 第三篇(旋转平移缩放)

头文件

#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H

#include "QtGui/QOpenGLBuffer"
#include "QtWidgets/QOpenGLWidget"
#include "QtGui/QOpenGLVertexArrayObject"
#include "QtGui/QOpenGLFunctions_4_5_Core"

class QOpenGLShaderProgram;

class OpenGLWidget
	: public QOpenGLWidget
	, protected QOpenGLFunctions_4_5_Core
{
public:

	/* @接口 默认构造函数
	 * @类名 [OpenGLWidget]
	 * @时间 2021年10月8号
	 */
	OpenGLWidget();

	/* @接口 默认析构
	 * @类名 [OpenGLWidget]
	 * @时间 2021年10月8号
	 */
	~OpenGLWidget();

	/* @接口
	 * @返回
	 * @类名 [OpenGLWidget]
	 * @时间 2021年10月8号
	 */
	virtual void paintGL();

	/* @接口
	 * @返回
	 * @类名 [OpenGLWidget]
	 * @时间 2021年10月8号
	 */
	virtual void initializeGL();

	/* @接口
	 * @类名 [OpenGLWidget]
	 * @时间 2021年10月8号
	 */
	virtual void resizeGL(int, int);

private:

	/* @接口
	* @类名 [OpenGLWidget]
	* @时间 2021年10月17号
	*/
	bool initShader();

	/* @接口
	 * @类名 [OpenGLWidget]
	 * @时间 2021年10月17号
	 */
	void initQTimer();

	/* @接口
	 * @类名 [OpenGLWidget]
	 * @时间 2021年10月17号
	 */
	void updateTimer();

private:

	float m_scale = 1.0;
	float m_xmove = 0.0;
	float m_ymove = 0.0;
	float m_rotate = 0;
	QTimer *m_timer = NULL;
	QOpenGLBuffer m_vbo, m_ebo;
	QOpenGLVertexArrayObject m_vao;
	QOpenGLShaderProgram *m_shaderProgram;

};

#endif /*OPENGLWIDGET_H*/

源文件

#include "QtCore/QTimer"
#include "openglwidget.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)
{

}

OpenGLWidget::~OpenGLWidget()
{

}

void OpenGLWidget::paintGL()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
	QMatrix4x4 gScale; gScale.scale(sin(m_scale));
	QMatrix4x4 gMove;
	gMove.translate(sin(m_xmove), cos(m_ymove));
	QMatrix4x4 gRotate;	gRotate.rotate(m_rotate, 1, 1);
	QMatrix4x4 gWorld = gMove * gRotate * gScale;
	m_shaderProgram->setUniformValue("gWorld", gWorld);

	m_vao.bind();
	glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, 0);
	m_vao.release();
}

bool OpenGLWidget::initShader()
{
	m_shaderProgram = new QOpenGLShaderProgram;
	m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader);
	m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader);

	if (!m_shaderProgram->link()) return false;
	return m_shaderProgram->bind();
}

void OpenGLWidget::initQTimer()
{
	m_timer = new QTimer; m_timer->start(1);
	connect(m_timer, &QTimer::timeout, this, &OpenGLWidget::updateTimer);
}

void OpenGLWidget::updateTimer()
{
	m_scale += 0.01;
	m_xmove += 0.01;
	m_ymove += 0.01;
	m_rotate += 1;
	repaint();
}

void OpenGLWidget::initializeGL()
{
	initializeOpenGLFunctions(); //初始化OPenGL功能函数
	glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
	glClearDepth(1.0);
	glEnable(GL_DEPTH_TEST);
	if (!initShader()) return;
	
	float vertices[] = {
		-1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f,
		0.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
		1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
		0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f
	};

	GLuint indices[] = {
		0, 3, 1,
		1, 3, 2,
		2, 3, 0,
		0, 1, 2
	};

	m_vao.create();
	m_vao.bind();
	m_vbo.create();
	m_vbo.bind();
	m_vbo.allocate(vertices, 4 * 6 * sizeof(GLfloat));
	m_ebo.create();
	m_ebo.bind();
	m_ebo.allocate(indices, 4 * 3 * sizeof(GLuint));

	int attr = -1;
	//顶点属性设置
	attr = m_shaderProgram->attributeLocation("vPosition");
	m_shaderProgram->setAttributeBuffer(attr, GL_FLOAT, 0, 3, sizeof(GLfloat) * 6);
	m_shaderProgram->enableAttributeArray(attr);
	//颜色属性设置
	attr = m_shaderProgram->attributeLocation("vColor");
	m_shaderProgram->setAttributeBuffer(attr, GL_FLOAT, sizeof(GLfloat) * 3, 3, sizeof(GLfloat) * 6);
	m_shaderProgram->enableAttributeArray(attr);

	m_vao.release();
	m_vbo.release();
	m_ebo.release();

	initQTimer();
}

运行结果:

QOpenGLWidget 第二篇 EBO、VBO、VAO 绘制三棱锥

QOpenGLWidget 第四篇 透视投影


 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值