本章前言:本章讲如何利用VS和QT来创建一个基本的QOpenGLWidget窗口和有关联的三个核心函数,因为版本更新可能会有大同小异,但基本的不会有变换,有了QT的帮助,我们不需要下载opengL、glsl、cmake只需要下载一个qt和使之跟vs链接的小插件即可,注意在下载qt的时候,记得按照opengl模块(虽然这个模块免费了,但是qt官网并没有默认放入核心三模块中)。

作者:本教程是我基于github上著名的learnopengl教学https://learnopengl-cn.github.io/和opengl官网https://www.khronos.org/opengl制作的个人opengl教学笔记。之所以选择Qt作为辅助,是因为qt中集成了opengl开发,让我们省去了很多原版opengl不必要的兼容操作和处理,可以把精力更好的放到图形开发上,个人能力有限,如有不足,请多指教。

开发环境:opengl+qt+vs2017+win10

(所有源代码全部开源公开,并且可以在我的个人公众号和博客下载)

个人制作视频教程https://www.bilibili.com/video/BV1X5411w7QV/

个人技术博客https://zobolblog.github.io/LearnOpenGLWithQT/Doc/01.html

  个人公众号

  

1.新建项目,选择GUI Application (新版的名字略有修改,但是只要选择带GUI的就可以了)

2.添加对应模块opengl、opengl extension(新版把debug和release分开了,无妨)

3.选择QWidget作为继承基类,这是qt官方推荐的QOpenGLWidget就是使用QWidget作为父类的。

其余保持不变即可

4.创建QWidget项目完成,看一下项目栏,有没有疏漏。

编译之后,正常显示窗口,就是正常。

5.替换父类,将QWidget替换成QOpenGLWidget,一共两处

6.添加对应头文件,两个。其中关于opengl版本的文件,至少要填到3.3之后(这之后opengl的版本更新都变化不大)。

类QOpenGLFunctions_x_x_Core是对OpenGL某个版本的包装器,这样就可以使用原版函数,如果不写,我们就只能用qt封装的另外一套函数,也可以用但是跟learnopengl教程不一样。

因为都是向下兼容型,选择3.3版本之后,你的计算机能带动的就行。

7.三个关键函数,QOpenGLWidget都制作成保护函数,都需要我们去继承,重新实现。

8.在源代码中继承,并实现。

virtual void initializeGL();//负责初始化,就是缓冲对象vao、vbo、ebo、着色器、纹理、摄像机。

virtual void resizeGL(int w, int h);//视图、窗口大小改变,自动调用

virtual void paintGL();//画,渲染一次。循环要添加update()函数

9.initializeGL()函数,负责初始化,就是缓冲对象vao、vbo、ebo、着色器、纹理、摄像机。

This virtual function is called once before the first call to paintGL() or resizeGL(). Reimplement it in a subclass.This function should set up any required OpenGL resources and state.

There is no need to call makeCurrent() because this has already been done when this function is called. Note however that the framebuffer is not yet available at this stage, so avoid issuing draw calls from here. Defer such calls to paintGL() instead.

10.resizeGL(int w, int h)函数,/视图、窗口大小改变,自动调用

This virtual function is called whenever the widget needs to be painted. Reimplement it in a subclass.There is no need to call makeCurrent() because this has already been done when this function is called.

Before invoking this function, the context and the framebuffer are bound, and the viewport is set up by a call to glViewport(). No other state is set and no clearing or drawing is performed by the framework.

11.paintGL()函数画,渲染一次。循环要添加update()函数

Sets the requested surface format.When the format is not explicitly set via this function, the format returned by QSurfaceFormat::defaultFormat() will be used. This means that when having multiple OpenGL widgets, individual calls to this function can be replaced by one single call to QSurfaceFormat::setDefaultFormat() before creating the first widget.

12. 在cpp文件中修改一下,paintGL函数的内容。

13.结果,看见一个黑色框框就是正确的QOpenGLWidget窗口。

源代码

HelloOpenGL.h:

#include <QtWidgets/QWidget>
#include "ui_HelloOpenGL.h"
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
class HelloOpenGL : public QOpenGLWidget
{
Q_OBJECT
public:
HelloOpenGL(QWidget *parent = Q_NULLPTR);
protected:
virtual void initializeGL();//负责初始化,就是缓冲对象vao、vbo、ebo、着色器、纹理、摄像机。
virtual void resizeGL(int w, int h);//视图、窗口大小改变,自动调用
virtual void paintGL();//画,渲染一次。循环要添加update()函数
private:
Ui::HelloOpenGLClass ui;
};
HelloOpenGL.cpp:
#include "HelloOpenGL.h"
HelloOpenGL::HelloOpenGL(QWidget *parent)
: QOpenGLWidget(parent)
{
}
void HelloOpenGL::initializeGL()
{
}
void HelloOpenGL::resizeGL(int w, int h)
{
}
void HelloOpenGL::paintGL()
{
update();
}
main.cpp:
#include "HelloOpenGL.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
HelloOpenGL w;
w.show();
return a.exec();
}

(1)《QT+OpenGL学习之我见》初始化窗口及三个重要函数 vs+Qt的更多相关文章

  1. Qt OpenGL:学习现代3D图形编程之四,透视投影浅析

    一.非真实的世界 与之前几篇文章不同的是,这里要画12个三角形,这个12个三角形构造一个方形棱柱(这里为长方体).棱柱的每个四边形表面由两个三角形组成.这两个三角形其中的一条边重合,而且它们的六个顶点 ...

  2. OpenGL学习进程(5)第三课:视口与裁剪区域

    本节是OpenGL学习的第三个课时,下面介绍如何运用显示窗体的视口和裁剪区域:     (1)知识点引入:     1)问题现象: 当在窗体中绘制图形后,拉伸窗体图形形状会发生变化: #include ...

  3. PyQt(Python+Qt)学习随笔:在一个窗口点击按钮弹出另一个窗口的实现方法及注意事项

    在Qt Designer中定义了两个窗口,一个主窗口一个弹出窗口,需要实现在主窗口点击一个按钮时弹出弹出窗口. 经老猿验证: 1.弹窗的窗口类型无特殊要求,只要是QWidget等窗口部件就可以,也可以 ...

  4. OpenGL学习--01--打开一个窗口

    // Include standard headers #include <stdio.h> #include <stdlib.h> // Include GLEW #incl ...

  5. OpenTK学习笔记(2)-工作窗口的三种方法创建方法(控制台)

    参考资料: 控制台下类的形式创建:http://www.cnblogs.com/podolski/p/7406628.html 总结: 一.控制台下类的形式创建 1.新建控制台应用 2.连网执行Nug ...

  6. OpenTK学习笔记(2)-工作窗口的三种方法创建方法(winfrom下类的形式创建)

    参考资料: https://www.codeproject.com/Articles/1167212/OpenGL-with-OpenTK-in-Csharp-Part-Initialize-the- ...

  7. OpenTK学习笔记(2)-工作窗口的三种方法创建方法(winfrom窗体控件形式创建)

    参考资料: https://social.msdn.microsoft.com/Forums/zh-TW/1b781685-c670-4338-953d-1957a8f24a66/opentkglco ...

  8. C语言学习之我见-strncat()可调整的字符串拼接函数

    strncat()函数,用于两个字符串的拼接. (1)函数原型 char * strncat(char * Dest,const char * Source,size_t _Count)` (2)头文 ...

  9. PyQt(Python+Qt)学习随笔

    老猿Python博文目录 老猿Python博客地址 PyQt学习随笔 PyQt(Python+Qt)帮助文档官网及文档下载 PyQt(Python+Qt)学习随笔:PyQt帮助文档导入assistan ...

随机推荐

  1. Go语言 映射(map)

    Go语言  映射(map) 1. 什么是 map2. 创建 map3. 访问 map4. nil map和空map5. map中元素的返回值6. len()和delete()7. 测试map中元素是否 ...

  2. python关于变量介绍

    python变量 一.变量分为两种解释 1.随时可以变化的量 称之为变量 (变化多端嘛) 2.不会被变化的量 称之为常量 (常常不动嘛) #我们学习的python中没有真正定义的常量 #只有在绑定一个 ...

  3. k8s TLS bootstrap解析-k8s TLS bootstrap流程分析

    当k8s集群开启了TLS认证后,每个节点的kubelet组件都要使用由kube-apiserver的CA签发的有效证书才能与kube-apiserver通信:当节点非常多的时候,为每个节点都单独签署证 ...

  4. Java学习day7

    Java继承不同与c++,格式为: public class 子类名 extends 父类名{ 语句体; } 继承提高了代码的复用性与维护性 在子类方法中访问一个变量时,首先在子类局部范围查找,其次到 ...

  5. Postman+newman+jenkins+git实战

    一.接口分类,流程,用例设计 接口分类: 外部接口:被测系统与外部其他系统之间的接口. 承保系统(被测系统),核算系统. 内部接口:被测系统内部各个子模块之间的接口. 承保系统(A模块,B模块) 测试 ...

  6. C#二次开发BIMFACE系列60 File Management文件管理服务及应用场景

    系列目录     [已更新最新开发文章,点击查看详细] 在我的博客<C#二次开发BIMFACE系列>教程中详细介绍了如何注册BIMFACE.测试.封装服务器端接口并提供了丰富的Demo.视 ...

  7. Java web与web gis学习笔记(一)——Tomcat环境搭建

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  8. YOLO系列梳理(三)YOLOv5

    ​  前言 YOLOv5 是在 YOLOv4 出来之后没多久就横空出世了.今天笔者介绍一下 YOLOv5 的相关知识.目前 YOLOv5 发布了新的版本,6.0版本.在这里,YOLOv5 也在5.0基 ...

  9. Visual Studio之安装(更新,扩展)速度缓慢解决方案

    一.背景 小伙伴们在安装visual studio,或者更新,扩展vs功能时,在家里网速正常的情况下,可能出现进度十分缓慢的问题,如何解决呢? 二.解决思路 修改hosts文件 1.地址:默认安装在 ...

  10. 一文带你读懂zookeeper在大数据生态的应用

    一个执着于技术的公众号 一.简述 在一群动物掌管的世界中,动物没有人类聪明的思想,为了保持动物世界的生态平衡,这时,动物管理员-zookeeper诞生了. 打开Apache zookeeper的官网, ...