15. Qt中OPenGL的参数传递问题
1. 说明
在OPenGL中,需要使用GLSL语言来编写着色器的函数,在顶点着色器和片段着色器之间需要参数值的传递,且在CPU中的数据也需要传递到顶点着色器中进行使用。本文简单介绍几种参数传递的方式:
(本文内容仅个人理解,有错请评论纠正…)
函数解读:
glVertexAttribPointer(参数一,参数二,参数三,参数四,参数五,参数六)
参数一:标号,和顶点着色器中layout(location=n)的location值对应,这样找到的数据就会自动传输给layout(location=n)对应的变量
参数二:连续寻找几个值,一般是3个(位置坐标/颜色rgb值)
参数三:数值的类型
参数四:一般都是GL_FALSE
参数五:寻找完需要的值的个数后,下一次在寻找需要跨越多少步长
参数六:起始寻找位置的指针偏移量(寻址起始位置)
下文用到的形式含义说明:
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,6*sizeof (float),(void*)0);//从第0个位置为起始位置开始找数据,每次找3个,查找结束后,跨6个位置当起始位置继续找
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,6*sizeof (float),(void*)(3*sizeof(float)));//从第3个位置为起始位置开始找数据,每次找3个,查找结束后,跨6个位置当起始位置继续找
//上面的起始位置是最后一个参数决定的,跨度是第五个参数决定的
2. 方式一:关键字 in / out
一般OPenGL的渲染流程是从CPU中拿到顶点数据,然后传输到顶点着色器中,经过顶点着色器的处理,会传输到片段着色器中进行再次处理。那么,顶点着色器和片段着色器之间的参数传递就可使用 in / out 关键字来传输。需要注意的是变量的名称要保证完全相同,这样OPenGL在底层遇到 in / out修饰的变量后,会自动将这两个同名变量连接到一起进行参数传输,示例代码如下:
顶点着色器代码:
#version 330 core
layout (location = 0) in vec3 aPos; //in 修饰,说明是从外界传输过来的
out vec4 vertexColor; //out修饰,说明是需要传输到外部的
void main(){gl_Position = vec4(aPos,1.0);vertexColor = vec4(0.5,0.0,0.0,1.0);
}
片段着色器代码:
#version 330 core
out vec4 FragColor; //out修饰,说明是需要传输到外部的
in vec4 vertexColor; //使用 in 修饰,定义同名变量,底层会将顶点着色器中的同名变量和这个变量进行连接,实现着色器间参数传递
void main(){FragColor = vertexColor;
}
3. 方式二:使用 layout 定位
layout一般是用在顶点着色器中定义变量的,比如当VAO通过定义的方式在VBO中拿到数据后,那么拿到的数据怎样传输给顶点着色器中进行使用呢?此时,就可以使用 layout 这个关键字。如下:
//加入有数据 vertices
float vertices[] = { //每一行数据的前三个是位置坐标,后三个是颜色值0.5f,0.5f,0.5f,1.0f,0.0f,0.0f,0.5f,-0.5f,0.0f,0.0f,1.0f,0.0f,-0.5f,-0.5f,0.0f,0.0f,0.0f,1.0f,-0.5f,0.5f,0.0f,0.5f,0.5f,0.5f,
}
//下面代码的意思是:定义一个变量,这个变量的数据是从VAO中获取,以 location 为标记来确定是哪一个VAO
layout (location = 0) in vec3 aPos;//在initializeGL()函数中,我们需要使用VAO通过某种方式在VBO缓存中拿数据,有可能是位置坐标数据,也有可能是纹理数据,所以可能会设置多个VAO来获取数据,那么上面的变量 aPos 怎么确定自己要在哪一个VAO中接收数据呢?就是通过上面 location 的值,比如:
//告诉VAO怎么在VBO中拿数据
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,6*sizeof (float),(void*)0);
//上行代码的第一个参数:指定VAO在VBO中取数据时的起始位置,同时也和顶点着色器中变量的 location 值对应,两者相同,则说明这个VAO后续查询获取的数据会传递到顶点着色器中并赋予对应变量,比如上述查询到的数据会赋值给 aPos;
//例2:
//顶点着色器中定义变量:
layout (location = 1) in vec3 aColor;
//在initializeGL()函数中:
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,6*sizeof (float),(void*)(3*sizeof(float)));
//上一行代码注意:第一个参数是1,和顶点着色器中变量 aColor 的 location = 1 是对应的
//例2中VAO查询到的数据会赋值给 aColor 变量
4. 方式三:使用 attributeLocation() 查询属性并定位
//比如我们在顶点着色器中定义变量:
in vec3 aPos; //未用关键字修饰,in仅表示此变量是外界输入进来的
//在initializeGL()函数中:
//先初始化着色器并绑定:
//添加着色器
shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shaders/Shaders/shape.vert");//注意:此处的路径最好用相对路径,绝对路径可能会打不开文件
shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shaders/Shaders/shape.frag");
shaderProgram.link(); //将两个着色器文件连接到一起
//查询着色器中变量位置:
GLint posLocation = shaderProgram.attributeLocation("aPos");//里面的参数是需要查找的变量名称
//后面设置VAO时使用上面这个变量:(即可将获取到的数据传递给指定位置的变量)
glVertexAttribPointer(posLocation,3,GL_FLOAT,GL_FALSE,6*sizeof (float),(void*)(3*sizeof(float)));
5. 方式四:使用 bindAttributeLocation() 直接绑定属性位置
与方式三类似,唯一不同的是此方式自己定义位置,并绑定到指定属性上,不需要去查找属性的位置。
//比如我们在顶点着色器中定义变量:
in vec3 aPos; //未用关键字修饰,in仅表示此变量是外界输入进来的
//在initializeGL()函数中:
//先初始化着色器并绑定:
//添加着色器
shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shaders/Shaders/shape.vert");//注意:此处的路径最好用相对路径,绝对路径可能会打不开文件
shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shaders/Shaders/shape.frag");
shaderProgram.link(); //将两个着色器文件连接到一起
//查询着色器中变量位置:
GLint posLocation = 1;
shaderProgram.bindAttributeLocation("aPos",posLocation);//直接随意设置个标志绑定到属性上
//后面设置VAO时使用上面这个变量:(即可将获取到的数据传递给指定位置的变量)
glVertexAttribPointer(posLocation,3,GL_FLOAT,GL_FALSE,6*sizeof (float),(void*)(3*sizeof(float)));
6. 方式五:使用 uniform 定义全局属性
上面的方式一到方式四一般是用在顶点着色器中,而使用 uniform 修饰的变量可以定义在任意着色器中,可以在任意着色器程序在任意阶段进行访问。
比如:在片段着色器中定义一个变量 ourColor,如下图所示:

上面片段着色器中的变量 ourColor 是可以在外界传入的,比如在 initializeGL() 函数中进行设置:
shaderProgram.setUniformValue("ourColor",0.0f,0.5f,0.0f,1.0f);//注意变量名要写正确
持续更新中,请大家多多关注…
相关文章:
15. Qt中OPenGL的参数传递问题
1. 说明 在OPenGL中,需要使用GLSL语言来编写着色器的函数,在顶点着色器和片段着色器之间需要参数值的传递,且在CPU中的数据也需要传递到顶点着色器中进行使用。本文简单介绍几种参数传递的方式: (本文内容仅个人理解&…...
注意,这本2区SCI期刊最快18天录用,还差一步录用只因犯了这个错
发表案例分享: 2区医学综合类SCI,仅18天录用,录用后28天见刊 2023.02.10 | 见刊 2023.01.13 | Accepted 2023.01.11 | 提交返修稿 2022.12.26 | 提交论文至期刊部系统 录用截图来源:期刊部投稿系统 见刊截图来源:…...
Could not find resource jdbc.properties问题的解决
以如下开头的内容: Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration 出现以上问题是没有在src/main/resources下创建jdbc.prop…...
【面试题】==与equals区别、Hashcode作用、hashcode相同equals()也一定为true吗?泛型特点与好处
文章目录1. 和 equals 的区别是什么?2.Hashcode的作用3. 两个对象的hashCode() 相同, 那么equals()也一定为 true吗?4.泛型常用特点5.使用泛型的好处?1. 和 equals 的区别是什么? “” 对于基本类型和引用类型 的作…...
Flex布局中的flex属性
1.flex-grow,flex-shrink,flex-basis取值含义 flex-grow: 延申性描述。在满足“延申条件”时,flex容器中的项目会按照设置的flex-grow值的比例来延申,占满容器剩余空间。 取值情况: 取负值无效。取0值表示不…...
SpringBoot + Ant Design Pro Vue实现动态路由和菜单的前后端分离框架
Ant Design Pro Vue默认路由和菜单配置是采用中心化的方式,在 router.config.js统一配置和管理,同时也提供了动态获取路由和菜单的解决方案,并将在2.0.3版本中提供,因到目前为止,官方发布的版本为2.0.2,所以…...
robotframework自动化测试环境搭建
环境说明 win10 python版本:3.8.3rc1 安装清单 安装配置 selenium安装 首先检查pip命令是否安装: C:\Users\name>pipUsage:pip <command> [options]Commands:install Install packages.download Do…...
尚硅谷《Redis7》(小白篇)
尚硅谷《Redis7 》(小白篇) 02 redis 是什么 官方网站: https://redis.io/ 作者 Git Hub https://github.com/antirez 03 04 05 能做什么 06 去哪下 Download https://redis.io/download/ redis中文文档 https://www.redis.com.cn/docu…...
并非从0开始的c++ day6
并非从0开始的c day6二级指针练习-文件读写位运算位逻辑运算符按位取反 ~位于(AND):&位或(OR): |位异或: ^移位运算符左移<<右移>>多维数组一维数组数组名一维数组名传入到函数参数中数组指…...
PMP考前冲刺2.22 | 2023新征程,一举拿证
承载2023新一年的好运让我们迈向PMP终点一起冲刺!一起拿证!每日5道PMP习题助大家上岸PMP!!!题目1-2:1.在新产品开发过程中,项目经理关注到行业排名第一的公司刚刚发布同类型的产品。相比竞品&am…...
RxJava的订阅过程
要使用Rxjava首先要导入两个包,其中rxandroid是rxjava在android中的扩展 implementation io.reactivex:rxandroid:1.2.1implementation io.reactivex:rxjava:1.2.0首先从最基本的Observable的创建到订阅开始分析 Observable.create(new Observable.OnSubscribe<S…...
【2.22】MySQL、Redis、动态规划
认识Redis Redis是一种基于内存的数据库,对数据的读写操作都是在内存中完成的,因此读写速度非常快,常用于缓存,消息队列,分布式锁等场景。 Redis提供了多种数据类型来支持不同的业务场景,比如String(字符串…...
2年手动测试,裸辞后找不到工作怎么办?
我们可以从以下几个方面来具体分析下,想通了,理解透了,才能更好的利用资源提升自己。一、我会什么?先说第一个我会什么?第一反应:我只会功能测试,在之前的4年的中我只做了功能测试。内心存在一种…...
Leetcode6. N字形变换
一、题目描述: 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下: 之后,你的输出需要从左往右逐行读取,产…...
将Nginx 核心知识点扒了个底朝天(十)
ngx_http_upstream_module的作用是什么? ngx_http_upstream_module用于定义可通过fastcgi传递、proxy传递、uwsgi传递、memcached传递和scgi传递指令来引用的服务器组。 什么是C10K问题? C10K问题是指无法同时处理大量客户端(10,000)的网络套接字。 Nginx是否支持将请求压…...
GPU显卡环境配置安装
前言 最近公司购买了一张RTX3090的显卡和一台新的服务器,然后对机器的GPU环境进行了安装和配置,然后简单记录一下 环境版本 操作系统:Centos7.8 显卡型号:RTX3090 Python版本:3.7.6 Tensorflow版本:2…...
CIMCAI super unmanned intelligent gate container damage detect
世界港航人工智能领军者企业CIMCAI中集飞瞳打造全球最先进超级智能闸口无人闸口ceaspectusG™视频流动态感知集装箱箱况残损检测箱况残损识别率99%以上,箱信息识别率99.95%以上World port shipping AI leader CIMCAIThe worlds most advanced super intelligent gat…...
web概念概述
软件架构:1. C/S: Client/Server 客户端/服务器端* 在用户本地有一个客户端程序,在远程有一个服务器端程序* 如:QQ,迅雷...* 优点:1. 用户体验好* 缺点:1. 开发、安装,部署,维护 麻烦…...
编译原理笔记(1)绪论
文章目录1.什么是编译2.编译系统的结构3.词法分析概述4.语法分析概述5.语义分析概述6.中间代码生成和后端概述1.什么是编译 编译的定义:将高级语言翻译成汇编语言或机器语言的过程。前者称为源语言,后者称为目标语言。 高级语言源程序的处理过程&#…...
MySQL(八)
服务器参数设置 general datadir/var/lib/mysql 数据文件存放的目录socket/var/lib/mysql/mysql.sock mysql.socket表示server和client在同一台服务器,并且使用localhost进行连接,就会使用socket进行连接pid_file/var/lib/mysql/mysql.pid 存储mysql的p…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
