当前位置: 首页 > news >正文

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 | 提交论文至期刊部系统 录用截图来源:期刊部投稿系统 见刊截图来源&#xff1a…...

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版本&#xff1a;3.8.3rc1 安装清单 安装配置 selenium安装 首先检查pip命令是否安装&#xff1a; C:\Users\name>pipUsage:pip <command> [options]Commands:install Install packages.download Do…...

尚硅谷《Redis7》(小白篇)

尚硅谷《Redis7 》&#xff08;小白篇&#xff09; 02 redis 是什么 官方网站&#xff1a; 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二级指针练习-文件读写位运算位逻辑运算符按位取反 ~位于&#xff08;AND&#xff09;&#xff1a;&位或&#xff08;OR&#xff09;&#xff1a; |位异或: ^移位运算符左移<<右移>>多维数组一维数组数组名一维数组名传入到函数参数中数组指…...

PMP考前冲刺2.22 | 2023新征程,一举拿证

承载2023新一年的好运让我们迈向PMP终点一起冲刺&#xff01;一起拿证&#xff01;每日5道PMP习题助大家上岸PMP&#xff01;&#xff01;&#xff01;题目1-2&#xff1a;1.在新产品开发过程中&#xff0c;项目经理关注到行业排名第一的公司刚刚发布同类型的产品。相比竞品&am…...

RxJava的订阅过程

要使用Rxjava首先要导入两个包&#xff0c;其中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是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成的&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列&#xff0c;分布式锁等场景。 Redis提供了多种数据类型来支持不同的业务场景&#xff0c;比如String(字符串…...

2年手动测试,裸辞后找不到工作怎么办?

我们可以从以下几个方面来具体分析下&#xff0c;想通了&#xff0c;理解透了&#xff0c;才能更好的利用资源提升自己。一、我会什么&#xff1f;先说第一个我会什么&#xff1f;第一反应&#xff1a;我只会功能测试&#xff0c;在之前的4年的中我只做了功能测试。内心存在一种…...

Leetcode6. N字形变换

一、题目描述&#xff1a; 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; 之后&#xff0c;你的输出需要从左往右逐行读取&#xff0c;产…...

将Nginx 核心知识点扒了个底朝天(十)

ngx_http_upstream_module的作用是什么? ngx_http_upstream_module用于定义可通过fastcgi传递、proxy传递、uwsgi传递、memcached传递和scgi传递指令来引用的服务器组。 什么是C10K问题? C10K问题是指无法同时处理大量客户端(10,000)的网络套接字。 Nginx是否支持将请求压…...

GPU显卡环境配置安装

前言 最近公司购买了一张RTX3090的显卡和一台新的服务器&#xff0c;然后对机器的GPU环境进行了安装和配置&#xff0c;然后简单记录一下 环境版本 操作系统&#xff1a;Centos7.8 显卡型号&#xff1a;RTX3090 Python版本&#xff1a;3.7.6 Tensorflow版本&#xff1a;2…...

CIMCAI super unmanned intelligent gate container damage detect

世界港航人工智能领军者企业CIMCAI中集飞瞳打造全球最先进超级智能闸口无人闸口ceaspectusG™视频流动态感知集装箱箱况残损检测箱况残损识别率99%以上&#xff0c;箱信息识别率99.95%以上World port shipping AI leader CIMCAIThe worlds most advanced super intelligent gat…...

web概念概述

软件架构&#xff1a;1. C/S: Client/Server 客户端/服务器端* 在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程序* 如&#xff1a;QQ&#xff0c;迅雷...* 优点&#xff1a;1. 用户体验好* 缺点&#xff1a;1. 开发、安装&#xff0c;部署&#xff0c;维护 麻烦…...

编译原理笔记(1)绪论

文章目录1.什么是编译2.编译系统的结构3.词法分析概述4.语法分析概述5.语义分析概述6.中间代码生成和后端概述1.什么是编译 编译的定义&#xff1a;将高级语言翻译成汇编语言或机器语言的过程。前者称为源语言&#xff0c;后者称为目标语言。 高级语言源程序的处理过程&#…...

MySQL(八)

服务器参数设置 general datadir/var/lib/mysql 数据文件存放的目录socket/var/lib/mysql/mysql.sock mysql.socket表示server和client在同一台服务器&#xff0c;并且使用localhost进行连接&#xff0c;就会使用socket进行连接pid_file/var/lib/mysql/mysql.pid 存储mysql的p…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...