在Qt中使用OpenGL(三)

Qt+OpenGL基础教程 基于Qt与OpenGL的UR3机械臂仿真与控制程序的先行文,介绍了如何画出一个可以变换视角的坐标系。 阅读详情
AI摘要

本文详细介绍了在Qt中使用OpenGL进行纹理映射的过程,包括修改Shader、加载纹理和绘制带纹理的矩形等内容。

前言

在Qt中使用OpenGL(一)
在Qt中使用OpenGL(二)
在之前的文章中,我们首先了解了在Qt中使用OpenGL的全流程,然后我们使用了一个最简单的例子将这个流程给过了一遍。
那么,在本篇文章中,我们将对“最简单的例子”进行一定的修改,以便达成我们接下来的目标:如果为我们绘制出来的东西,加上“纹理”

什么是纹理

既然我们要研究怎么加上纹理,那么我们就需要首先知道什么是纹理。
首先,我们上一个版本的程序,只是绘制出来了一个“白色的三角形”,事实上,在真实的应用里,这种“绘制白色三角形”的需求是不可能出现的,我们大部分时间遇到的情况应该是“添加一个模型”对吧。
那么,你有没有意识到,当你添加一头牛的模型时,它看起来像是一头牛的原因,除了它的形状是一头牛之外,是不是它身上的各个部位的颜色也像是一头牛呢?
这些颜色是怎么来的呢?难道是用shader给牛身上的每个顶点指定了颜色?就像之前我们给顶点指定了白色?
对,也不对。
是的,这些看起来正确的颜色的确是通过shader进行指定的。但是不对的地方是,它并不是通过给每个顶点设置颜色实现的,而是通过“纹理映射”实现。
简单理解,就是将“一层皮”,套到了3D世界中的牛的身上,牛身上的每个顶点都对应到了这层皮上的一个位置,这样,只要每个顶点对应的位置是正确的,那么我们看到的牛就和现实中的牛差距就不会太大了。
那么,为了可以用最简单的例子来解释纹理,我们不使用牛,而是选择最简化的场景,假设我有一张很漂亮的风景画:
请添加图片描述我想让这个风景画出现在3D世界中,作为画廊中的一幅画。怎么办呢?

绘制矩形与设定纹理映射坐标

当然,在我们想要在3D世界中增加一幅画,首先还有一个问题要解决。很显然,这张图是个矩形,而我们之前做过的唯一的事情只有绘制三角形。
那么怎么绘制一个矩形呢?
聪明的你大概也猜出来了,没错,我们吧矩形沿对角线剪开,不就是两个三角形了?所以我们只要画两个三角形不就行了?
没错,就是这个道理。我们只要画两个三角形就行了。
然后呢,OpenGL很贴心的提供了多种绘制多个三角形的方法,其中有一个方法,使得我们只要“逆时针定义4个顶点”就可以方便的绘制出可以组成矩形的两个三角形了。
怎么理解呢?
在这里插入图片描述
这是默认情况下,OpenGL的屏幕坐标。也就是说,如果我们想要绘制一个占满整个屏幕的矩形,也就是两个三角形,我们需要逆时针,定义4个顶点。
很显然,在这个屏幕坐标中,左上就是(-1,1),左下就是(-1,-1),右下就是(1,-1),右上就是(1,1),那么我们按照这个顺序就可以定义四个顶点了。(z值得话,我们只需要都使用0就行了,简单吧。)当然,你可以任意的调整顶点的顺序,但是顶点必须是逆时针排列顺序。

float _vertex[] = {
//  顶点			
	-1,  1, 0,	// 左上
	-1, -1, 0,	// 左下
	 1, -1, 0,	// 右下
	 1,  1, 0,	// 右上
};

至此,我们画两个三角形的准备工作就完成了。
但是还有一个工作没有完成,那就是纹理映射坐标。
是的,当我们需要考虑纹理的时候,从顶点的时候就需要考虑了。为什么?
还记得之前说法吗?

简单理解,就是将“一层皮”,套到了3D世界中的牛的身上,牛身上的每个顶点都对应到了这层皮上的一个位置

是的,你需要将每一个顶点,都对应到纹理上的一个位置。这个对应方法,就是使用“纹理映射坐标”。
简单来讲,就是用(x,y)这个二维坐标来表示纹理上的一个位置,其中,x与y的值域为[0,1]。
其中,(0,0)表示左下角。(1,1)点表示右上角。当然,你也可以把(0,0)当作左上角,(1,1)当作右下角,就和一般情况下我们编辑图片时那样。具体你要怎么看待这个坐标系统,实际上不重要。重要的是,一定要保证有一个统一的标准。目前,我们的统一标准是(0,0)表示左下角,(1,1)点表示右上角。
了解了这些,我们就可以给顶点附加纹理映射坐标了,方法很简答,只需要在每个顶点坐标后面,附加两个代表纹理映射坐标的float值就行了,就像这样:

	// 顶点缓存中前三个是顶点坐标, 后两个是纹理坐标, 一个顶点由5个float值组成
	float _vertex[] = {
	//  顶点			纹理
		-1,  1, 0,	0, 1, // 左上
		-1, -1, 0,	0, 0, // 左下
		 1, -1, 0,	1, 0, // 右下
		 1,  1, 0,	1, 1, // 右上
	};

注意,当你这么做了,就意味着你的一个顶点有5个float值了,而不是之前的3个。
还记得之前的文章里说过吗?OpenGL根本不知道什么9个值3个顶点的标准,现在明白为什么了嘛?因为这种标准根本就不存在啊!现在,当我们需要“纹理映射”的时候,原先9个值3个顶点就变成了20个值,4个顶点了。每个顶点需要5个值来表示!
那么,我们要如何告诉OpenGL这个新的顶点缓存标准呢?

如何使用包含纹理的顶点缓存

很显然,之前我们使用了setAttributeBuffer()这个函数告诉了OpenGL每个顶点有3个值,那么我们同样需要使用setAttributeBuffer()这个函数告诉OpenGL,现在规则改变了,每个点有5个值,其中前三个是顶点坐标,后两个是纹理坐标。
可是,我们要怎么操作呢?
首先,我们需要做的是,修改Shader。
没错,还记得我们之前的Shader里面,定义了1个vec3类型的输入嘛?
这也就意味着OpenGL只能处理一个vec3数据,也就是3个float类型。可我们一个顶点有5个float类型,怎么办?那就再加一个vec2类型的输入不就好了嘛!

#version 330 core
in vec3 vPos;
in vec2 vTexture;
out vec2 oTexture;
void main()
{
    gl_Position = vec4(vPos, 1.0);
    oTexture = vTexture;
}

于是我们的顶点Shader就变成这个样子了,也就是获取坐标的同时也要获取纹理坐标,然后将纹理坐标发送给其它的Shader。
请注意,我们除了添加了一个输入变量vTexture(in开头),我们同时还定义了一个输出变量oTexture(out开头),这是为什么呢?
因为Shader是一种链式调用的代码,顶点Shader会自动的从顶点缓存中获取数据,(也不是自动,因为我们需要告诉OpenGL如何操作),可FragmentShader并不会,所以我们需要从顶点缓存中获取数据,然后将获取到的数据传给FragmentShader。
那么,到了FragmentShader,又要做什么操作呢?

#version 330 core
in vec2 oTexture;
uniform sampler2D uTexture;
void main()
{
    gl_FragColor = texture(uTexture, oTexture);
} 

如图所示,我们只要定义一个名字和顶点Shader中定义的输出变量名字一致的输入变量,顶点Shader中的输出变量就会自动的传递到FragmentShader中的输入变量中。然后我们就可以运用OpenGL内置的函数texture来进行纹理映射了。没错,texture这个函数的意义就是将纹理指定位置映射到顶点上。
请注意,这里我们有了一个除了in和out之外的另一个指示器,uniform,简单来说它和in一样,也表示了一种输入,但是,和in不一样的是,它的来源可以是任何地方。而in呢?要么是来自其它shader的输出,要么只能来自于顶点缓存的输入。你可以在不修改顶点缓存的情况下,在任何合理的地方输入uniform的值,例如我们可以根据需要,动态的改变纹理。而sampler2D 这个类型就表示二维纹理了。
好了,至此,顶点,纹理坐标,shader我们都修改好了,让我们告诉OpenGL要如何使用顶点缓存吧。
简单来说,就是这样:

	// 绑定顶点坐标信息, 从0 * sizeof(float)字节开始读取3个float, 因为一个顶点有5个float数据, 所以下一个数据需要偏移5 * sizeof(float)个字节
	m_program->setAttributeBuffer("vPos", GL_FLOAT, 0 * sizeof(float), 3, 5 * sizeof(float));
	m_program->enableAttributeArray("vPos");
	// 绑定纹理坐标信息, 从3 * sizeof(float)字节开始读取2个float, 因为一个顶点有5个float数据, 所以下一个数据需要偏移5 * sizeof(float)个字节
	m_program->setAttributeBuffer("vTexture", GL_FLOAT, 3 * sizeof(float), 2, 5 * sizeof(float));
	m_program->enableAttributeArray("vTexture");

我们都知道setAttributeBuffer()函数的第1个参数表示shader中变量的名字,第2个参数表示数据类型,那怎么理解setAttributeBuffer()函数的第3个参数呢?
第3个参数表示在一个顶点中从哪个位置开始,是你需要的数据。
很显然,我们一个顶点由5个float值组成,前三个表示位置,后两个表示纹理坐标,于是对于位置,从第0个位置开始,也就是 0 * sizeof(float)个字节,而纹理坐标从第3个位置开始,也就是 3 * sizeof(float)个字节
setAttributeBuffer()函数的第4个参数是指有几个数据,坐标有3个数据,纹理坐标有2个数据
setAttributeBuffer()函数的第5个参数表示你的顶点缓存,多少数据表示一个顶点。我们的顶点缓存,5个float值表示一个顶点,于是就是5 * sizeof(float))个字节。
至此,顶点与纹理坐标都处理好了,接下来就是绘制了。

绘制带纹理的矩形

聪明的你一定发现了,到现在为止,除了纹理坐标,我们实际上根本没有处理任何纹理上的东西。
比如,我们根本就没有从文件中加载一张图片当作纹理啊!
没错,那么,我们就再修改一下初始化,加载一张图片当作纹理吧。
首先,在Qt中,OpenGL的纹理使用QOpenGLTexture类表示的,于是我们加载一张图片当作纹理就可以这么写:

m_texture = new QOpenGLTexture(QImage("D:/20210928.jpg").mirrored());

只要我们在类的头文件中定义了QOpenGLTexture *m_texture = nullptr;,那么初始化的时候,我们就可以创建纹理了。
有没有发现什么奇怪的事情?没错,我们加载图片的时候,使用mirrored()这个函数,为什么?查一下这个函数就会发现,它默认会将图片沿y轴进行镜像翻转。
还记得介绍纹理的坐标系统的说的话吗?

其中,(0,0)表示左下角。(1,1)点表示右上角。当然,你也可以把(0,0)当作左上角,(1,1)当作右下角,就和一般情况下我们编辑图片时那样。

因为我们用(0,0)表示左下角,所以坐标和一般的图片坐标发生了镜像翻转,所以加载纹理的时候只要也镜像翻转一下,问题就解决了。
好了,纹理加载好了,我们要如何告诉OpenGL有这么一个纹理呢?
很简单,绘制图像之前bind一下,绘制完毕release就行了。
也就是这样:
在这里插入图片描述
在这里,我们绘制的矩形的参数不是之前绘制三角形时的GL_TRIANGLES,0,3,而是GL_TRIANGLE_FAN,0,4。其中,GL_TRIANGLE_FAN就是之前提到的另一种绘制三角形的方法,它允许我们逆时针定义四个顶点,然后绘制出来两个三角形组成一个矩形。(当然,实际上能不能组成一个矩形OpenGL并不关心,能不能组成矩形是用户定义的顶点有关,和OpenGL没关系。甚至它实际上并不是用来绘制矩形的,仅仅是一种可以快速的绘制多个三角形的方法罢了,我们只是利用了它的特性而已)

好了,让我们运行一下程序吧:
在这里插入图片描述
恭喜!你成功了!(虽然图片的比例错了,但是你成功的将纹理中的图片绘制到窗口中了)

此时,聪明的你一定发现了一件奇怪的事情。
我们在Shader中定义了一个uniform sampler2D uTexture;用来表示纹理。
但是自始至终,我们都没有给这个输入变量赋值。那OpenGL又是怎么能将我们加载的纹理传到Shader中呢?
因为OpenGL的纹理系统有一个默认设定,那就是,使用纹理的时候(调用bind函数的时候),会被自动的对应到当前激活的纹理,默认激活的纹理就是纹理0,而我们第一个定义的纹理变量,就会被当作纹理0。这样,我们使用的纹理就自动的和Shader中定义的纹理对应上了,完美。
在这里插入图片描述
注意Qt文档中的说明,除了默认的bind函数,还有一个可以指定将纹理bind到那个索引的重载函数。

下一篇:在Qt中使用OpenGL(四)

【QT】——OpenGL学习(一) OpenGL简介 OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。 这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。 OpenGL的高效实现(利用了图形加速硬件)存在于Windows,部分UNIX平台 阅读详情

相关推荐

Qt中的OpenGL

也叫可编程管线,提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。其中,顶点着色器和片段着色器需要自己去编写,几何着色器可选择性编写,有这三个可以编辑的部分,即为可编程管线(管线可以理解为一个处理流程)。Ps:状态机是一种理论模型,用于描述一个系统在不同时间点的行为和状态转移规律。OpenGL自身是一个巨大的状态机上下文(Context)通常把OpenGL上下文比作一个大的结构体,包含很多子集:当前状态只有一份。

MasterPJ的博客 5202

Qt中使用OpenGL的三种方式

3. 继承QOpenGLWidget 与QOpenGLExtraFunctions。2. 继承QOpenGLFunctions类可直接使用OPENGL函数。通过使用QOpenGLContext来操作OPENGL函数。1.继承QOpenGLWidget并重写基类如下函数。在OPENGL中使用Shader。直接使用OPENGL函数。

7360

QT中OpenGL开发起步

OpenGL中环境搭建 近期由于需要做一个GUI展示的OpenGL程序,因此想到用QT来做界面,需要在QT中写OpenGL,配完环境后,在这里总计一下。 QT基础 总体看来,QT的版本较为混乱,有时候傻傻弄不清楚,QT dialog/widget/mainwindow。又需要有界面,又要有pro文件,一圈下来,加上网上教程版本混乱,已经凌乱了。后来在同学帮助下,看了一些博客教程,综合...

新安浅滩的博客 1万+

QT+ OpenGL学习

本篇完整工程见gitee:https://gitee.com/turbolove/qtopengl.git 对应点的tag,由turbolove提供技术支持,您可以关注博主或者私信博主。什么是openglopen graphics library 他是一个由Khronos组织制定并且维护的规范opengl核心是一个c库,同时也支持多种语言的派生。

turbolove的博客 6535

Qt中使用GLEW进行OpenGL开发

Qt中使用GLEW进行OpenGL开发(Windows平台)为什么要使用GLEW使用VS创建Qt项目设置Widget重新实现paintEngine添加GLEW库到工程设置OpenGL上下文设置GL像素格式检测支持OpenGL的力度创建GLRC把当前窗口设置为OpenGL上下文绘制背景颜色更新视口绘制添加QtEvent调用绘制Post绘制事件绘制测试源码下载开启新征程 为什么要使用GLEW 因为工作需求绘制视频,原本使用的Qt(我使用的是5.9.8的版本)自带的QOpenGL进行视频绘制,但是在稳定行测试中经

sttplay666 4096

关于QT5.10+opengl的使用

本人最近在用qt5.10和opengl结合,看了一些博主写的文章,但是在编写程序时还是遇到了各种各样的问题,想来总结下。现在QT5之后有两种方式来结合opengl,最新的可以看看qt官方的opengl window的例子,本人暂时没有用到,还是用旧的方式。现在开始介绍吧!~~~问题总结:1.出现undefined reference to 。。。。的问题2.运行后界面全黑,不显示你所画的内容3.想...

黑手 1万+

游戏编辑器开发三: QT中使用glew进行opengl开发

  不用Qt自带的QtOpenGL,而是在QtWidgets窗口中嵌入opengl (glew) 方式,有两个原因: 一、qt自带的opengl有bug 。 二、opengl 扩展功能可能不全,所以使用glew。 一、使用opengl方法: 首先创建opengl 设备上下文 程序,再创建一个OGLWidget继承 QWidget,在qt编辑器中对使用到的Widget 设置提升窗口部件,再设置提升的...

哲学天空的博客 4278

UDP_千兆光通信(四)Tri Mode Ethernet MAC ip核

其中 Transmit Engine 从 AXI-Stream TX 接口接收数据,并添加前导码 Preamble、帧起始界定符 SFD、帧校验序列 FSC 等,并在必要时(长度小于最小 MAC 帧长度)填充数据,因此在使用 TEMAC 时,MAC 帧的这几个部分就不需要我们自己添加了(不过其他的 MAC 帧部分,可选的帧过滤器 Frame Filter 用于过滤与一组可配置过滤器匹配的帧,一般用于过滤掉目的 MAC 地址与本设备不一致的帧,TEMAC 默认开启帧过滤器。默认值为使用64位宽的计数器。

lzr232的博客 1776

OpenGL学习笔记(三):了解管线、VAO、VBO的关系,介绍Qt如何使用OpenGL

原博主博客地址:http://blog.youkuaiyun.com/qq21497936 本文章博客地址:http://blog.youkuaiyun.com/qq21497936/article/details/78762511 《OpenGL学习笔记》系列博客目录地址:http://blog.youkuaiyun.com/qq21497936/article/category/7315532 Op

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

SSD性能测试进阶:用fio的io_uring引擎榨干你的NVMe硬盘

本文深入探讨了如何利用fio的io_uring引擎对NVMe SSD进行深度性能测试。通过对比传统libaio引擎,详解了io_uring低开销、高并发的优势。文章提供了从测试矩阵设计、队列深度分析到写入放大观察和尾延迟可视化的完整进阶方法,并附有实战案例与脚本,旨在帮助用户科学压榨NVMe硬盘的极限性能,获取更真实的评估数据。

weixin_29247219的博客 327

机器学习【学校智慧食堂及其应用】

本文主要介绍机器学习【智慧食堂及其应用】

qq_201729558 2572

QT5.7中使用OpenGL开发记录(三)---- 绘制立方体

QT5.7中使用OpenGL开发记录(三)     前言:最近在做一个项目,需要使用QT结合OpenGL进行开发。由于原来没有怎么用过OpenGL,只知道是个开源图形库,所以先在网上查询了一些资料,发现QT5.5以上版本已经集成了OpenGL,不过和纯OpenGL的使用有些区别,而且相关资料较少。为了便于后续开发并且方便大家共同学习,这里将我的学习过程进行记录(本博客内容只记录了本人的学习过程,...

lonely_13的专栏 5245

WeDetect:基于视觉-语言检索的目标检测新范式

目标检测正从传统回归与分类耦合范式,向开放、灵活、可扩展的多模态检索范式演进。检索式检测(Retrieval-based Detection)将检测任务重构为视觉特征与文本语义的联合匹配过程,依托候选框索引库与双塔架构,天然支持开放词汇、零样本识别与小目标定位。其技术价值在于解耦空间感知与语义理解,消除NMS与anchor匹配等冗余计算,显著提升推理效率与跨场景泛化能力。典型应用场景包括工业质检中的缺陷新增识别、遥感图像小目标检测、低光照鲁棒视觉系统等。WeDetect正是这一范式的代表性实现,深度融合视觉

weixin_30878501的博客 363

php观察者模式和管道模式,OpenGL学习笔记(三):了解管线、VAO、VBO的关系,介绍Qt如何使用OpenGL...

GLWidget与QOpenGLWidgetGLWidget与QOpenGLWidget类都是OpenGL图形渲染控件。重写其paintGL(),resizeGL(),initializeGL()三个函数。initializeGL() 设置OpenGL渲染上下文,定义了显示列表,等会调用一次,第一次调用resizeGL()或paintGL()之前调用,一般是加载顶点数据,着色器数据和一些初始化的工...

weixin_29770217的博客 176

squidpy 教程 1:在 AnnData 和 Squidpy 中导入空间数据

这些是 10x Genomics Visium 的 Space Ranger 输出提供的 keys,因此是第一个被采用的 keys。在这种情况下,我们假设空间坐标与像素具有相同的比例,因此我们将该值设置为 1。为此,我们将使用模拟数据集,并通过示例展示您应该注意的重要细节,以便利用 AnnData-Scanpy-Squidpy 生态系统的全部功能。并不是绝对必要的,但会节省您大量的输入,因为它是 Squidpy 和 Scanpy 的默认值。正如你所看到的,空间坐标被缩小了,图像被“放大”了。

🧑‍🎓 博士研究生在读 🔬 分享生物信息学、神经生物学方面的知识 💬 合作请在后台留言 2256

软件工程案例教程·韩万江【课后习题】

!!!!

weixin_57858263的博客 6419

(1)《QT+OpenGL学习之我见》初始化窗口及三个重要函数 vs+Qt

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

落剑仙宫 1267

NSGA-II 多目标优化 —— 理论、案例与交互式 GUI 实现

本文详细介绍了 NSGA-II 多目标优化算法的基本原理、数学模型和实现流程。从非支配排序、拥挤距离计算到遗传操作,NSGA-II 通过对种群进行分层和排序,能够有效求解多目标优化问题,获得 Pareto 前沿解集。通过机械结构优化、资源分配和控制参数调优等典型案例,我们展示了 NSGA-II 在实际工程中的广泛应用。为帮助工程师和研究者更直观地理解算法求解过程,本文提供了基于 Python 与 PyQt6 的交互式 GUI 演示系统代码示例。

闲人编程的博客 2120

在Qt中使用OpenGL

在Qt5.4之前,OpenGL在Qt中的实现主要是继承QGLWidget,在5.4版本之后,则改为QOpenGLWidget和QOpenGLFunctions(QOpenGLExtraFunctions),这是qt官方的推荐写法,可以在qt自带的examples中搜索opengl找到。 除了这种写法,直接使用指定OpenGL版本的包装器也是可以的,在头文件中包含QOpenGLFunctio...

TiredWind的博客 3万+

Python 爬虫实战:Twitter 数据定向抓取(特定话题 + 用户推文爬取与分析)

在社交媒体研究、舆情监测和市场分析等领域,Twitter 数据具有极高的价值。本文将详细介绍如何使用 Python 构建一个完整的 Twitter 数据爬取系统,包括特定话题和用户推文的爬取与分析。我们将涵盖从认证到数据存储、清洗、分析和可视化的全流程。

u014481728的博客 1038

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

在Qt中使用OpenGL(一)

在Qt中使用OpenGL,尽可能地使用Qt的风格

Ninsun的博客 2万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

QT中使用自带的OpenGL模块开发

原文:http://nehe.gamedev.net/ 翻译:https://www.cnblogs.com/arxive/p/6238969.html

qing666888的专栏 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

在 Qt 中使用 OpenGL 详解

在 Qt 中使用 OpenGL 详解

m0_46566693的博客 9004

Qt5使用openGL初体验

Qt5使用openGL初体验Qt5使用openGL初体验下载Qt5搭建Qt的opengl基本框架源码部分gldemo.h头文件下面是gldemo.cpp源码文件main函数主文件 Qt5使用openGL初体验 最近在这里一个魔方项目,用到了opengl的相关部分,好久也没有玩这个东东,所以还是写下这个过程,作为初学者还是要多动手才行。首先看一看运行的效果,这里绘画了一个三维坐标系,由x、y、z三个...

mcuman996的博客 5915

QT_OpenGL渲染总结

QT+OpenGL渲染总结

qq_35312463的博客 7225

【QT教程】QT6 OpenGL编程 QT OpenGL编程

OpenGL简介OpenGL简介OpenGL(Open Graphics Library)是一个跨语言、跨平台的应用程序编程接口(API),用于渲染2D、3D向量图形。它被广泛用于计算机图形和游戏开发中。OpenGL是一个独立于硬件的API,这意味着它提供了一套与具体硬件无关的绘制命令,使得开发者编写的程序可以在支持OpenGL的不同平台上运行。OpenGL的历史OpenGL最早是由SGI(Silicon Graphics Inc.)公司在1992年开发的。

QT性能优化QT原理源码QT界面美化 4063
上一篇: 在Qt中使用OpenGL(二)
下一篇: 在Qt中使用OpenGL(四)
Ninsun Closear
博客等级 码龄12年 321粉丝 22原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值