在Qt中使用OpenGL(四)

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

本文介绍如何在Qt中使用OpenGL绘制一个可旋转的3D色子,包括设置顶点和纹理坐标、构建变换矩阵等内容。

前言

在Qt中使用OpenGL(一)
在Qt中使用OpenGL(二)
在Qt中使用OpenGL(三)
在之前的文章中,我们通过一个最简单的例子完成了在Qt中使用OpenGL绘图的全过程,然后又使用了纹理系统成功的显示了一张图片。接下来,我们就可以尝试着用OpenGL做一些它真正应该做的事情,例如绘制一个简单3D物体,然后让这个3D物体旋转起来,就像这样:
在这里插入图片描述我们使用上一个文章中的代码作为基础代码,但是,接下来我们要做的并不是写代码,而是进行一些思考,以及学习一些额外的知识。

我们要怎么画一个色子?

我们都知道,一个色子,也就是正六面体,是由六个正方形组成的。
上一篇文章中我们既然可以画出来一个带纹理的图片。那么,很显然,想要画出来一个色子,我们就需要画6张带纹理的图片,让它们组成一个正六面体。
我们知道4个(顶点坐标+纹理坐标)可以画一个矩形,那么一个正六面体,也就是6个矩形,就需要24个(顶点坐标+纹理坐标)了。
相信大家都知道正六面体是可以展开的吧,下面就是一个色子展开后的样子:
在这里插入图片描述我们就可以用这样图当作纹理。
注意,这张图是400x400分辨率的,色子的每个面是一个100x100的图片,为什么这样设计?下面有400x100的空间可是被浪费掉了。
很简单,只要我们心算一下就知道了:简化坐标。
要是我们使用400x300的大小,那么纵向的坐标就会出现0.333333333这种除不尽的情况,我们就不是非常方便来写坐标了。当然,较真的来说我们只需要写1/3.f和2/3.f就可以了,不过在这里,我们还是用这种400x400正方形的纹理吧。
注意,本次,我们不使用左下角为(0,0)右上角为(1,1)的纹理坐标系统,而是使用和图片相同的左上角为(0,0),右下角为(1,1)的纹理坐标系统,因为本次我们需要人工来处理这些坐标映射,使用和图片相同的坐标系统比较节省脑子。
然后,再让我们思考一下一个色子,它的8个顶点的坐标是什么,然后怎么组合出6个正方形出来。并且正方形顶点需要逆时针排列,然后再给每个顶点一个纹理坐标。
当然,这里就不说思考过程了,只说结果(1在前面,6在后面,2在右侧,5在左侧,3在上面,4在下面):

// 顶点缓存中前三个是顶点坐标, 后两个是纹理坐标, 一个顶点由5个float值组成
float _vertex[] = {
//顶点						纹理
// 1
	-1,  1,  1,		0.50, 0.25,	// 左上
	-1, -1,  1,		0.50, 0.50,	// 左下
	 1, -1,  1,		0.75, 0.50,	// 右下
	 1,  1,  1,		0.75, 0.25,  // 右上
// 6
	 1,  1, -1,		0.00, 0.25,	// 左上
	 1, -1, -1,		0.00, 0.50,	// 左下
	-1, -1, -1,		0.25, 0.50,	// 右下
	-1,  1, -1,		0.25, 0.25,	// 右上
// 2
	 1,	 1,  1,		0.75, 0.25,  // 左上
	 1,	-1,  1,		0.75, 0.50,	// 左下
	 1,	-1, -1,		1.00, 0.50,	// 右下
	 1,	 1, -1,		1.00, 0.25,	// 右上
// 5
	-1,  1, -1,		0.25, 0.25,	// 左上
	-1, -1, -1,		0.25, 0.50,	// 左下
	-1, -1,  1,		0.50, 0.50,	// 右下
	-1,  1,  1,		0.50, 0.25,	// 右上
// 3
	-1,  1, -1,		0.00, 0.00,	// 左上
	-1,  1,  1,		0.00, 0.25,	// 左下
	 1,  1,  1,		0.25, 0.25,  // 右下
	 1,  1, -1,		0.25, 0.00,	// 右上
// 4
	-1, -1,  1,		0.00, 0.50,  // 左上
	-1, -1, -1,		0.00, 0.75,	// 左下
	 1, -1, -1,		0.25, 0.75,	// 右下
	 1, -1,  1,		0.25, 0.50,	// 右上
};

绘制六个矩形

之前的绘制逻辑中,我们只需要绘制一个矩形就行了,可这一次,我们需要绘制6个。
有什么区别吗?
有的。
还记得之前说了吗?OpenGL并不关系我们绘制的两个三角形能否组成一个矩形。
所以,OpenGL并不是帮我们绘制矩形,而是帮我们绘制两个三角形。
所以,我们必须按照每次两个三角形的方法来绘制6个矩形,也就是循环六次,每次绘制4个点。

// 绘制
for (int i = 0; i < 6; ++i)
{
	glDrawArrays(GL_TRIANGLE_FAN, i * 4, 4);
}

完成了吗?
让我们修改一下纹理的路径:

m_texture = new QOpenGLTexture(QImage("D:/dice.png"));

注意,因为纹理坐标修改了,所以我们这次加载图像的时候不需要镜像了。
这就是目前我们可以看到的样子:
在这里插入图片描述
没错,如果你只是做到这里,那么你只能看到6个点。
就和你之前加载一张纹理当作图片没什么区别,根本看不出来什么3D。我们辛苦计算的6个矩形只能看到一个,不仅和上一篇文章中一样变形了(并不是一个矩形,而是随着窗口的缩放而变形),并且根本看不出来这是个色子。
那么,我们缺少了什么呢?

3D变换

当我们使用OpenGL的时候,我们需要时刻记住,我们是在一个3D空间中,而我们的显示器只能显示一张图片。
那么,如何通过一张图片,可以让我们意识到我们是在看一个3D空间呢?
那就需要依靠3D空间的一些基础逻辑了。
例如近大远小,例如近处物体会遮挡远处物体等。
那么,要如何做到呢?
简单来说,就是我们可以通过一系列的数学计算,将三维空间的一个物体,映射到一个二维平面,然后当我们观察这个二维平面时,可以有一种我们是在三维空间的某一个位置观察它的错觉。
更加贴合现实的理解就是,我们用照相机给它照了一张相片,然后让你看到了这样相片。
这就是为什么我们在3D中会有摄像机这个概念,因为我们显示3D空间的方法,就好比用摄像机拍摄一般。
我最早学习OpenGL的时候,这个空间投影的概念就是被抽象为了摄像机,还有相关的API接口可以使用。可最新版本的OpenGL中,这些概念都被剔除了,我们需要自己,通过数学的方法,来将这个概念给模拟出来。也就是对顶点进行一系列的坐标变换,让它表现出我们在用一个摄像机拍摄的感觉出来。
没错,聪明的你肯定想到了,我们又要使用Shader了。
这一次,我们需要使用Shader中的另一个数据格式了,矩阵。
如果你无法理解也没关系,因为我们要做的事情,非常的简单,定义3个矩阵,然后让顶点依次乘以这些矩阵就行了。
简单来说就是要这样:

#version 330 core
in vec3 vPos;
in vec2 vTexture;
out vec2 oTexture;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
void main()
{
    gl_Position = projection * view * model * vec4(vPos, 1.0);
    oTexture = vTexture;
}

我们定义了3个uniform的变量,projection,view与model,它们都是mat4类型的。
它们分别叫做投影矩阵(projection),视图矩阵(view)和模型矩阵(model)。
这些矩阵有什么用呢?
简单来讲,投影矩阵负责让你看到的画面,符合近大远小的透视规律,并且保证无论你的窗口的宽高比是多少,你看到的画面都不会再变形了。
视图矩阵负责模拟一个摄像机的镜头,让你可以在3D空间中的某个位置去观察另一个位置。
模型矩阵负责让你绘制模型的时候,可以顺便对它进行缩放,旋转,平移的操作。
矩阵乘法是从右到左的,所以我们的顶点会首先进行缩放,旋转,平移,然后会被摄像机拍摄,最终会进行近大远小的透视变换。
在Qt中,这些矩阵都可以通过QMatrix4x4类进行表示,于是我们可以定义三个成员变量:

QMatrix4x4 m_projection;
QMatrix4x4 m_view;
QMatrix4x4 m_model;

投影矩阵

还记得投影矩阵可以干什么吗?
它负责让你看到的画面,符合近大远小的透视规律,并且保证无论你的窗口的宽高比是多少,你看到的画面都不会再变形。
可这在数学上要怎么实现呢?
不用怕,Qt已经提供了相应的函数,你只需要使用即可:

void OpenGLWidget::resizeGL(int w, int h)
{
	m_projection.setToIdentity();
	m_projection.perspective(60, (float)w / h, 0.001, 1000);
}

还记得我们一直没有用上的resizeGL函数嘛?这次我们终于可以使用了。
因为我们需要保证无论你的窗口的宽高比是多少,你看到的画面都不会再变形,所以我们需要具体的知道,你的窗口的大小到底是多少。
setToIndentity函数保证了你接下来的所有矩阵运算都会在一个单位矩阵上进行。
perspective函数就可以构建出一个基于你的窗口大小的近大远小的投影矩阵了。它的第一个参数表示了你要用什么样的视角来进行投影。你可以理解为你看到的画面的视野有多大。
人眼在头部不动的情况下,视野大概为60°。所以我们使用60这个值来模拟人眼看到的透视结果。
注意:这里的角度是指纵向视野的角度,横向视野并不进行限制,你的窗口越宽,看到的内容就会越多,但是靠近边缘的部分,变形也会越严重。
它的第二个参数就是你的窗口的横纵比了,记得转化为float再运算,第三和第四个参数表示距离你的摄像机多近个多远范围内的物体要被显示。超出这个范围的物体将无法被显示。

视图矩阵

视图矩阵用于模拟摄像机,所以我们就可以用QMatrix4x4类的lookAt函数来设置你的视角。

m_view.setToIdentity();
m_view.lookAt(QVector3D(3, 3, 3), QVector3D(0, 0, 0), QVector3D(0, 1, 0));

第一个参数表示你的眼睛在哪里,第二个参数表示你的眼睛看向了哪里,第三个参数表示你的头顶朝向是哪里,毕竟你是可以歪着脑袋观察东西的,甚至可以倒立着看东西的,所以需要有一个向量来说明你在观察物体的时候,你的观察角度是什么。
注意,前两个向量是具体的坐标,第三个向量表示的是方向。
于是,我们就要求摄像机在(3,3,3)这个位置观察(0,0,0)这个位置,因为我们的色子的位置就在(0,0,0)并且我们色子的棱长为2,(3,3,3)这个位置应该可以很好的观察到色子。

模型矩阵

模型矩阵用于让你绘制的模型可以缩放,旋转和平移,那么,我们就可以实现让模型旋转的功能了,于是我们可以这么用:

m_model.setToIdentity();
m_model.rotate(m_angle, 0, 1, 0);

rotate函数使得矩阵最终将表示绕某个轴进行一定角度的旋转。注意,这里的角度是具体的角度,如果我们每次都首先调用setToIdentity清零,则旋转的角度是不会累加的。
那么,我们希望这个模型可以一直不停的转下去,于是我们可以设置一个定时器,然后以60帧/秒的频率修改m_angel的值,每帧+1,到了360度就归0。这样,每帧的旋转角度都会递增,于是我们就可以看到一个旋转的模型了。
别忘了我们的类是一个Qt类,自带定时器的。所以我们就可以在构造函数中开启一个定时器,让它的超时时间符合60帧:

OpenGLWidget::OpenGLWidget(QWidget *parent)
	: QOpenGLWidget(parent)
{
	startTimer(1000 / 60);
}

然后我们就可以在定时器事件中来修改旋转角度和矩阵了:

void OpenGLWidget::timerEvent(QTimerEvent *event)
{
	m_angle += 1;
	if (m_angle >= 360)
		m_angle = 0;
	m_model.setToIdentity();
	m_model.rotate(m_angle, 0, 1, 0);
	repaint();
}

别忘了在最后调用repaint告诉OpenGL重新绘制。

应用矩阵

我们设置了这些矩阵之后,就可以告诉OpenGL这些矩阵的存在了(实际上就是告诉Shader就行了)。
方法很简单,调用Shader的对应函数即可:

// 绑定变换矩阵
m_program->setUniformValue("projection", m_projection);
m_program->setUniformValue("view", m_view);
m_program->setUniformValue("model", m_model);

一定要在Shader启用后再调用。
于是,最终的paintGL函数如下:
在这里插入图片描述
至此,一切工作都完成了,我们可以运行一下程序,看看最终结果了。

下一篇:在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】QT学习之OpenGL开发笔记

Qt提供了与OpenGL实现集成的支持,使开发人员有机会在更传统的用户界面的同时显示硬件加速的3D图形。Qt有两种主要的UI开发方法:QtQuick和QtWidgets。它们的存在是为了支持不同类型的用户界面,并建立在针对每种类型进行了优化的独立图形引擎上。可以将在OpenGL图形API中编写的代码与Qt中的这两种用户界面类型结合起来。当应用程序有自己的OpenGL相关代码时,或者当它与基于OpenGL的第三方渲染器集成时,这可能很有用。Qt OpenGL模块包含方便类,使这种类型的集成更容易、更快。

爱看书的小沐 6070

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

海思QT开发系列(四):Hi3559 Qt+OpenGL移植

海思QT开发系列(一):3559平台QT移植 海思QT开发系列(二):构建海思Qt项目Sample 海思QT开发系列(三):海思QT开发系列(三):Hi3559 Qt Sample开发板运行测试 参考 海思3559A QT 5.12移植(带webengine 和 opengl es) Qt5.9.7 移植到Hi3536,支持OpenGL和tsLib 海思开发板hi3559移植带opengl的qt并成功运行血泪史 EGL library doesn’t support Emulator extension

一只海星的主页 5690

opengl png图片 qt_Qt翻页效果实现(四):OpenGL图像渲染

OpenGL贴图OpenGL里面的图像渲染,是通过将图片映射成纹理,然后通过顶点坐标和对应的纹理坐标映射到物体表面。顶点坐标这里我们只有三个屏平面,在Qt翻页效果实现(二)文章中各点的坐标,在OpenGL里面就属于顶点坐标了。然而由于OpenGL里面的坐标系与屏幕坐标系不同,里面原点坐标在右下角。比如上图中 P点的坐标现在才是(0,0),O点坐标是(0,h),D点坐标是(w,0)等等。这样就需要对...

weixin_31678781的博客 741

Qt5版NeHe OpenGL教程之四:3D空间

在上节课的内容上作些扩展,我们现在开始生成真正的3D对象,而不是象前两节课中那样3D世界中的2D对象。我们给三角形增加一个左侧面,一个右侧面,一个后侧面来生成一个金字塔(四棱锥)。给正方形增加左、右、上、下及背面生成一个立方体。 我们混合金字塔上的颜色,创建一个平滑着色的对象。给立方体的每一面则来个不同的颜色。只需要在上节课的基础上改动render函数void Lesson4::render() ...

草上爬的博客 2917

Qt_OpenGL3D图形的绘制和旋转:开启三维世界的大门

Qt_OpenGL3D图形的绘制和旋转:开启三维世界的大门 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代计算机图形学中,三维图形的绘制与旋转是构建虚拟现实和增强现实应用的基础技能。今天要推荐的开源项目——Qt_OpenGL3D,正是一个专注于三维图形绘制的教程资源库。该项目通过详细的步骤解析,展示了如何在Qt框架下使用OpenGL绘制三维四棱锥并进行旋转操作。...

gitblog_06740的博客 885

QT软件开发-基于FFMPEG设计视频播放器-GPU硬解、OpenGL渲染(四)

前面几篇文章里分别介绍了ffmpeg软解、硬解、音频解码,完成视频帧渲染,音频解码播放。之前做的视频播放器里,虽然也使用了硬件加速解码,解码确实快,但是渲染都采用QWidget方式渲染绘制,占用CPU较高,并且采用QWidget方式渲染,需要将硬解码之后的数据转为RGB24,然后封装为QImage这个过程非常消耗时间,如果是高清4K视频整个视频解码播放就会非常卡顿,CPU占用直接100%。这篇文章将渲染方式换成OpenGL,解码方式还是采用硬件加速解码,充分利用GPU,降低CPU占用,提高整体视频播放效率。

1897

qcom bypass node介绍

介绍qcom bypass node,以及如何让其生效

haodada1226的博客 2045

QT5 OpenGL (四, 绘制立体图形)

概要 效果图 主要代码 代码解析概要前面几篇博客,已经从基本的绘图, 上色到旋转都已经讲完了, 但它们都只是限于平面图形,而对于立体图形并没有讲到。 本篇主要来讲opengl绘制立体图形。 我们在小学就知道, 线是由点构成, 点构成面, 面构成立体图形。 所以,立体图形的绘制,就是绘制多个有对应关系的平面。 而平面的绘制,就是由多个点的坐标组成。前面几篇博客已经讲过了。效果图主要代码void Ope

li235456789的专栏 9099

37张图详解MAC地址、以太网、二层转发、VLAN

MAC 地址 每个网卡或三层网口都有一个 MAC 地址, MAC 地址是烧录到硬件上,因此也称为硬件地址。MAC 地址作为数据链路设备的地址标识符,需要保证网络中的每个 MAC 地址都是唯一的,才能正确识别到数据链路上的设备。 MAC 地址由 6 个字节组成。前 3 个字节表示厂商识别码,每个网卡厂商都有特定唯一的识别数字。后 3 个字节由厂商给每个网卡进行分配。厂商可以保证生产出来的网卡不会有相同 MAC 地址的网卡。 现在可以通过软件修改 MAC 地址,虚拟机使用物理机网卡的 MAC 地址,并不能保.

networktp的博客 4745

Qt_OpenGL3D图形的绘制和旋转

Qt_OpenGL3D图形的绘制和旋转 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了Qt框架下使用OpenGL进行3D图形绘制与旋转的示例教程资源。具体内容围绕如何绘制一个四棱锥,详细讲解了从坐标计算到图形渲染的完整过程。 资源描述 本教程主要介绍如何在Qt环境中利用OpenGL绘制三维四棱锥。四棱锥是一种基础的立体图形,由四个三角形侧面和一个四边形底面组成。在O...

gitblog_06799的博客 289

13个GNS3 3.0.5 appliances设备模板镜像合集:IOSv/L2,IOU L2/L3,以及IOS-XE

13个GNS3 appliances设备模板:IOSv/L2,IOU L2/L3,以及IOS-XE合集

haierccc的博客 1075

异步bus交互(一)— 两级DFF同步器

异步bus交互(一)— 两级DFF同步器 跨时钟域处理 & 亚稳态处理 1.问题产生 现在的芯片(比如SOC,片上系统)集成度和复杂度越来越高,通常一颗芯片上会有许多不同的信号工作在不同的时钟频率下。比如SOC芯片中的CPU通常会工作在一个频率上,总线信号(比如DRAM BUS)会工作在另一个时钟频率下,而普通的信号又会工作在另外的时钟频率下。这3个不同时钟频率下工作的信号往往需要相互沟通和传递信号。 不同时钟域下的信号传递就涉及到跨时钟域信号处理,因为相互之间的频率、相位不一样,如果不做处理或者

qq_44816673的博客 5121

OpenGL_Qt学习笔记之_04(3D图形的绘制和旋转)

OpenGL_Qt学习笔记之_04(3D图形的绘制和旋转)      绘制四棱锥      四棱锥由5个面构成一个封闭的立体图,其中4个共顶点的侧面是三角形,底面是个四边形。如果我们要绘制一个3D的四棱锥只需要绘制这5个面即可,绘制的方法和前一篇文章OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)的相同。只不过这里的顶点坐标是3维的,所以图像深度那一维不一定为0。因此我们可以

hbyzl的专栏 3039

SpringBoot Redis入门(一)——redis、Lettuce、Redisson使用

Lettuce是SpringBoot自带的Redis客户端,性能比Redis要好, 是线程安全的,支持同步编程,异步编程,响应式编程,自动重新连接,主从模式,集群模块,哨兵模式Redisson 是一个在 Redis 的功能基础上实现的 Java 驻内存数据网格客户端。实现了分布式和可扩展的 Java 数据结构,提供很多分布式相关操作服务,例如分布式锁,分布式集合,可通过 Redis 支持延迟队列。

朗朗的博客 3834

Qt5与现代OpenGL学习(四)X轴方向旋转60度

在mainwindow.ui中,添加QWidget,并提升为:Triangle。

hgaohr1021的博客 443

【低空经济】多源异构数据融合的低空智能感知系统设计与实现

本文探讨了低空智能感知系统在多源异构数据融合中的设计与实现,重点解决无人机等低空飞行器的安全监测问题。通过雷达、光学和红外传感器的数据融合,系统识别准确率提升至92%,并实现120ms的低延迟处理。文章详细介绍了时空对齐、特征级融合和动态权重自适应等关键技术,为低空经济发展提供可靠技术支持。

weixin_29065659的博客 343

玩转openclaw+企业微信

OpenClaw横空出世:AI从问答到执行的范式革命 OpenClaw作为2026年AI领域的重大突破,实现了从对话机器人到智能执行体的进化。其核心价值在于"自主执行"而非简单交互,通过六层解耦架构(表现层、网关层、运行时层、技能层、工具层、记忆层)构建完整执行闭环。关键技术包括Model Context Protocol实现多模型兼容,以及事件驱动架构确保实时响应。安装过程支持多平台,通过Node.js环境即可快速部署,并支持对接主流大模型。OpenClaw标志着AI开始真正&quot

西木风落 1591

基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(四)纹理

本篇目的是在Qt中学习使用QOpenGLTexture类绑定纹理,分别生成普通纹理,混合纹理与在shader中使用纹理单元。 (Vries的原教程地址如下,https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 关于函数的具体解析请看这个教程,本篇旨在对Vires思想做Qt平台的移植) 一.生成普通纹理 将...

博客 4330

RK3568 HDMI输出调试:分辨率切换与EDID解析

厂商信息(Vendor ID)显示器型号(Product ID)支持的分辨率列表色彩特性音频支持情况检查项方法HPD 信号EDID 读取当前模式TMDS 时钟PHY 状态。

小灰灰的博客 1491

在Qt中使用OpenGL

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

TiredWind的博客 3万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 在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、付费专栏及课程。

余额充值