利用QT进行OpenGL的学习

2 篇文章 0 订阅

在学习OpenGL的时候,很多都是基于例如GLFW等第三方库来进行图像的的显示和窗口管理的,但是对于一些熟悉Qt的人来说,学习OpenGL,Qt也是一个非常不错的平台。就我个人而言,我相对来说比较喜欢QT来开发,Qt有很好的窗口管理功能,例如你只需要重写相关的鼠标函数等,你就能很简单的进行鼠标事件的管理等。
Qt中,你如果想要使用OpenGL进行开发,你只需要继承QOpenGLWidget和QOpenGLExtraFunctions,你就能使用OpenGL的功能。
有一点需要注意的是:你必须在你的类中重写void paintGL()、void initializeGL()、void resizeGL(int w,int h);这三个函数。在initializeGL函数中记得调用initializeOpenGLFunctions()来初始化OpenGL的相关功能。
void initializeGL()函数是用来进行初始化的,由系统自行调用。
void resizeGL(int w,int h)函数是在窗口的大小改变的时候,由系统自己调用、该函数主要用来改变视口等,你也可以不用实现它。
void paintGL()函数是用来执行画图的函数,在运行的过程中,你如果想要该函数被调用,执行画图的功能,你需要手动的调用update()函数,来触发该函数的调用。
下面直接给例子:

#pragma once

#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLExtraFunctions>

class OpenGLTest : public QOpenGLWidget, protected QOpenGLExtraFunctions
{
    Q_OBJECT

public:
    OpenGLTest(QWidget *parent = Q_NULLPTR);

	~OpenGLTest();

protected:
	virtual void paintGL();
	virtual void initializeGL();
	virtual void resizeGL(int w, int h);

private:
	unsigned int VBO;
	unsigned int VAO;
	unsigned int shaderProgram;
};
#include "OpenGLTest.h"
#include <QDebug>
#include <iostream>

using namespace std;
#define GET_STR(x) #x

const char* vertexShaderSource = GET_STR(
	attribute vec4 vPos;
void main()
{
	gl_Position = vPos;
}
);

const char* fragmentShaderSource = GET_STR(
	void main()
{
	gl_FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
);


OpenGLTest::OpenGLTest(QWidget *parent)
    : QOpenGLWidget(parent)
{
	
}

OpenGLTest::~OpenGLTest()
{
	glDeleteVertexArrays(1, &VAO);
	glDeleteBuffers(1, &VBO);
	glDeleteProgram(shaderProgram);
}

void OpenGLTest::paintGL()
{
	glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT);

	glUseProgram(shaderProgram);
	glBindVertexArray(VAO);
	glDrawArrays(GL_TRIANGLES, 0, 3);
}
void OpenGLTest::initializeGL()
{
	initializeOpenGLFunctions();

	unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
	glCompileShader(vertexShader);
	int success;
	char infoLog[512] = { 0 };
	glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
	if (!success)
	{
		glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
		cout << infoLog << endl;
	}

	unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
	glCompileShader(fragmentShader);
	glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
	if (!success)
	{
		glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
		cout << infoLog << endl;
	}

	shaderProgram = glCreateProgram();
	glAttachShader(shaderProgram, vertexShader);
	glAttachShader(shaderProgram, fragmentShader);
	glLinkProgram(shaderProgram);
	glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
	if (!success)
	{
		glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
		cout << infoLog << endl;
	}

	glDeleteShader(vertexShader);
	glDeleteShader(fragmentShader);

	GLfloat vertices[] = {
		-0.5f,-0.5f,0.0f,
		0.5f,-0.5f,0.0f,
		0.0f,0.5f,0.0f
	};
	//unsigned int VBO, VAO;
	glGenVertexArrays(1, &VAO);
	glBindVertexArray(VAO);

	glGenBuffers(1, &VBO);
	glBindBuffer(GL_ARRAY_BUFFER, VBO);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
	glEnableVertexAttribArray(0);

}
void OpenGLTest::resizeGL(int w, int h)
{

}

运行结果:
在这里插入图片描述

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一个跨平台的C++应用程序开发框架,它提供了大量的库和工具,用于开发各种类型的应用程序。其中,QtOpenGL模块是用于在Qt应用程序中使用OpenGL图形库的工具集合。 QtOpenGL模块提供了许多OpenGL相关的类和函数,方便开发者在Qt应用程序中进行图形渲染和处理。通过使用这些类和函数,开发者可以方便地创建各种类型的OpenGL可视化效果,如3D模型的渲染、纹理贴图、光照效果、变换等。 QtOpenGL案例实际上就是通过使用QtOpenGL模块来实现各种OpenGL图形效果的示例程序。这些案例涵盖了从简单到复杂的多个场景和功能,提供了开发者学习和参考的资源。 例如,一个简单的QtOpenGL案例可以是一个旋转的立方体。开发者可以利用QtOpenGL模块创建一个OpenGL窗口,通过设置视角、模型的旋转等参数,实现一个立方体在窗口内旋转的效果。这个案例可以帮助开发者了解如何使用QtOpenGL模块创建简单的3D图形效果。 另外,QtOpenGL模块还提供了一些高级功能,如多重采样抗锯齿、帧缓冲对象、着色器等,这些功能可以让开发者实现更复杂和高级的OpenGL图形效果。 总之,QtOpenGL案例提供了一个学习和实践的平台,开发者可以通过这些案例了解和掌握如何使用QtOpenGL模块进行图形渲染和处理。同时,这些案例也可以作为开发者开发自己的OpenGL应用程序的参考和借鉴。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值