GLSL ES着色器语言 使用矢量和矩阵的相关规范

目录

矢量和矩阵类型 

下面是声明矢量和矩阵的例子:

赋值和构造

矢量构造函数

矩阵构造函数 

构造矩阵的几种方式

访问元素

. 运算符

矢量的分量名

[ ]运算符

运算符

矢量和矩阵可用的运算符

矢量和矩阵相关运算

矢量和浮点数的运算

矢量运算

矩阵和浮点数的运算

矩阵右乘矢量

矩阵左乘矢量

矩阵与矩阵相乘


GLSL ES支持矢量和矩阵类型,这两种数据类型很适合用来处理计算机图形。矢量和矩阵类型的变量都包含多个元素,每个元素是一个数值(整型数、浮点数或布尔值)。矢量将这些元素排成一列,可以用来表示顶点坐标或颜色值等,而矩阵则将元素划分成行和列,可以用来表示变换矩阵。下图给出了矢量矩阵的例子。

矢量和矩阵类型 

下面是声明矢量和矩阵的例子:

赋值和构造

我们使用等号(=)来对矢量和矩阵进行赋值操作。记住,赋值运算符左右两边的变量/值的类型必须一致,左右两边的(矢量或矩阵的)元素个数也必须相同。比如说,下面这行代码就会出错。

这里,vec4类型变量有4个元素,你应当以某种方式传入4个浮点数值。通常我们使用与数据类型同名的内置构造函数来生成变量,对于vec4类型来说,就可以使用内置的vec4()函数。比如,如果要创建4个分量各是1.0、2.0、3.0和4.0的vec4类型变量,你就可以像下面这样调用vec4()函数。 

这种专门创建指定类型的变量的函数被称为构造函数(constructor functions),构造函数的名称和其创建的变量的类型名称总是一致的。 

矢量构造函数

在GLSL ES中,矢量非常重要,所以GLSL ES提供了丰富灵活的方式来创建矢量。比如:

在第2行代码中,构造函数忽略了v3的第3个分量,只用其第1个和第2个分量创建了一个新的变量。类似地,在第3行代码中,只向构造函数中传入了一个参数1.0,构造函数就会自动地将这个参数值赋给新建矢量的所有元素。但是,如果构造函数接收了不止1个参数,但是参数的个数又比矢量的元素个数少,那么就会出错。

最后,也可以将多个矢量组合成一个矢量,比如:

这里的规则是,先把第1个参数v2的所有元素填充进来,如果还未填满,就继续用第2个参数v4中的元素填充。

矩阵构造函数 

矩阵构造函数的使用方式与矢量构造函数的使用方式很类似。但是,你要保证存储在矩阵中的元素是按照列主序排列的。下面几个例子显示了使用矩阵构造函数的不同方式。

构造矩阵的几种方式

● 向矩阵构造函数中传入矩阵的每一个元素的数值来构造矩阵,注意传入值的顺序必须是列主序的。

● 向矩阵构造函数中传入一个或多个矢量,按照列主序使用矢量里的元素值来构造矩阵。

● 向矩阵构造函数中传入矢量和数值,按照列主序使用矢量里的元素值和直接传入的数值来构造矩阵。 

● 向矩阵构造函数中传入单个数值,这样将生成一个对角线上元素都是该数值,其他元素为0.0的矩阵。 

与矢量构造函数类似,如果传入的数值的数量大于1,又没有达到矩阵元素的数量,就会出错。 

访问元素

为了访问矢量或矩阵中的元素,可以使用.[]运算符,下面将分节叙述。

. 运算符

在矢量变量名后接点运算符(.),然后接上分量名,就可以访问矢量的元素了。矢量的分量名如下表所示。

矢量的分量名

由于矢量可以用来存储顶点的坐标、颜色和纹理坐标,所以GLSL ES支持以上三种分量名称以增强程序的可读性。事实上,任何矢量的x、r或s分量都会返回第1个分量,y、g、t分量都返回第2个分量,等等。如果你愿意,你可以随意地交换使用它们。比如: 

如你所见,在这些例子中,x、r和s虽然名称不同,但访问的却都是第1个分量。如果试图访问超过矢量长度的分量,就会出错: 

将(同一个集合的)多个分量名共同置于点运算符后,就可以从矢量中同时抽取出多个分量。这个过程称作混合(swizzling)。在下面这个例子中,我们使用了x、y、z和w,其他的集合也有相同的效果: 

聚合分量名也可以用来作为赋值表达式(=)的左值:

记住,此时的多个分量名必须属于同一个集合,比如说,你不能使用v3.was。 

[ ]运算符

除了.运算符,还可以使用[]运算符并通过数组下标来访问矢量或矩阵的元素。注意,矩阵中的元素仍然是按照列主序读取的。与在JavaScript中一样,下标从0开始,所以通过[0]可以访问到矩阵中的第1列元素,[1]可以访问到第2列元素,[2]可以访问到第3列元素,等等,如下所示:

此外,连续使用两个[]运算符可以访问某列的某个元素:

同样,你也可以同时使用[]运算符和分量名来访问矩阵中的元素,如下所示:

这里有一个限制,那就是在[]中只能出现的索引值必须是常量索引值(constant index),常量索引值的定义如下:

● 整型字面量(如0或1)。

● 用const修饰的全局变量或局部变量,不包括函数参数。

● 循环索引。

● 由前述三条中的项组成的表达式。

下面这个例子就用到了const变量作为访问数组元素的索引:

下面这个例子用到了const组成的表达式作为索引:

注意,你不能使用未经const修饰的变量作为索引值,因为它不是一个常量索引值(除非它是循环索引):

运算符

下表显示了矢量和矩阵所支持的运算。矩阵和矢量的运算符与基本类型(比如整数)的运算符很类似。注意,对于矢量和矩阵,只可以使用比较运算符中的==和!=,不可以使用>、<、>=和<=。如果你想比较矢量和矩阵的大小,应该使用内置函数,比如lessThan()。

矢量和矩阵可用的运算符

注意,当运算赋值操作作用于矢量或矩阵时,实际上是逐分量地对矩阵或矢量的每一个元素进行独立的运算赋值。 

矢量和矩阵相关运算

下面这些例子显示了矢量和矩阵在运算时的常见情形。我们假设,在这些例子中,变量是如下定义的:

矢量和浮点数的运算

这个例子显示了+操作符的作用: 

例如,v3a=vec3(1.0,2.0,3.0)而f=1.0,那么结果就是v3b=(2.0,3.0,4.0)。

矢量运算

矢量运算操作发生在矢量的每个分量上。 

例如,v3a=vec3(1.0,2.0,3.0)而v3b=(4.0,5.0,6.0),那么结果就是v3c=(5.0,7.0,9.0)。

矩阵和浮点数的运算

矩阵与浮点数的运算发生在矩阵的每个分量上。 

矩阵右乘矢量

矩阵右乘矢量的结果是矢量,其中每个分量都是原矢量中的对应分量,乘上矩阵对应行的每个元素的积的加和。 

矩阵左乘矢量

矩阵与矩阵相乘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127980.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java“牵手”淘宝商品详情数据,淘宝商品详情API接口,淘宝API接口申请指南

淘宝平台商品详情接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取淘宝商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口,通过…

【vue2第十六章】VueRouter 声明式导航(跳转传参)、路由重定向、页面未找到的提示页面404、vue路由模式设置

声明式导航(跳转传参) 在一些特定的需求中,跳转路径时我们是需要携带参数跳转的,比如有一个搜索框,点击搜索的按钮需要跳转到另外一个页面组件,此时需要把用户输入的input框的值也携带到那页面进行发送请求,请求数据。…

如何利用客户旅程打造好的用户体验?

在当今竞争激烈的市场中,提供卓越的用户体验已经成为企业脱颖而出的关键因素之一。客户旅程是实现出色用户体验的有力工具之一,而HubSpot的客户旅程规划功能为企业提供了强大的支持,帮助他们更好地理解、管理和改善客户的互动过程。今天运营坛…

YOLOv5算法改进(15)— 更换Neck之AFPN

前言:Hello大家好,我是小哥谈。在YOLOv5中添加AFPN(Adaptive Feature Pyramid Network)可以提高目标检测的准确性。AFPN是一种用于目标检测任务的功能增强模块,它能够自适应地融合来自不同层级的特征图,以提…

C#文件拷贝工具

目录 工具介绍 工具背景 4个文件介绍 CopyTheSpecifiedSuffixFiles.exe.config DataSave.txt 拷贝的存储方式 文件夹介绍 源文件夹 目标文件夹 结果 使用 *.mp4 使用 *.* 重名时坚持拷贝 可能的报错 C#代码如下 Form1.cs Form1.cs设计 APP.config Program.c…

【UI自动化测试】Jenkins配置

前一段时间帮助团队搭建了UI自动化环境,这里将Jenkins环境的一些配置分享给大家。 背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化测试和性能测试&…

【FusionInsight 迁移】HBase从C50迁移到6.5.1(01)迁移概述

【FusionInsight 迁移】HBase从C50迁移到6.5.1(01)迁移概述 HBase从C50迁移到6.5.1(01)迁移概述迁移范围迁移前的准备HDFS文件检查确认HBase迁移目录确保数据落盘停止老集群HBase服务停止新集群HBase服务 HBase从C50迁移到6.5.1&a…

时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化

时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 LMD局部均值分解 直接替换Excel即可运行包含频谱图相关系数图 Matlab语言 1.算法新颖…

分享配置FreeRTOSConfig.h文件因部分宏值配置不对以及相应函数未定义出现的三个错误解决方法

今天来分享一个在创建FreeRTOS时候调用官方的FreeRTOSConfig头文件时,因部分宏值的配置与FreeRTOS内核文件中的函数不匹配,导致编译时候出现了相应的错误。 于是,既然遇到了,就准备拿出来讲一下,让其他遇到的小伙伴也…

Docker的架构描述与安装部署

概述 Docker是一个开放的容器化平台,其提供能力轻松地支撑业务应用的开发、打包、装载、分发以及运行,在DevOps领域中,docker能高效地应对业务应用的持续集成以及持续发布(CI/CD),其架构如下所示&#xff…

被百度判定为低质量网站了!如何整改?

我是卢松松,点点上面的头像,欢迎关注我哦! 先说结论:接受现实,不要幻想百度恢复了! 百度自9月初大批量删除百度资源平台权限以来,几乎90%(未经证实**,但数量确实不小)的网站都被取消了权限&am…

2023 IntelliJ IDEA下载、安装教程, 附详细图解

文章目录 下载与安装IDEA推荐阅读 下载与安装IDEA 首先先到官网下载最新版的IntelliJ IDEA, 下载后傻瓜式安装就好了 官网下载地址:https://www.jetbrains.com/ 1、下载完后在本地找到该文件,双击运行 idea 安装程序 2、点击 Next 3、选择安装路径&…

C++ 多线程 学习笔记

线程睡眠很稳定,但无线程睡眠不稳定 线程调用类方法: 有参数时调用方法: 当参数为引用时: 当同一资源被多个线程同时引用时,为防止资源抢占,使用mutex,互斥锁 头文件#include "mutex"…

Java中的锁

Java中的锁 乐观锁 乐观锁看待多线程访问同一资源的态度是乐观的,乐观锁假设线程访问同一资源时不会产生冲突^ 冲突,所以线程在访问资源时没有加锁同时也不会阻塞,但是乐观锁也是认为冲突^ 冲突还是有可能发生的,因此存在版本号…

浏览器中怎样查看前后端传值

路径:F12–>Network -->Fetch/XHR,选择一个接口地址。 在payload里面是前端发送给后端的参数。也即客户端发送给服务端的请求数据,即接口地址入参。 Preview和Response里都是后端返回给前端的。Preview是格式化过的,比较容易看。Resp…

初学python(一)

一、python的背景和前景 二、 python的一些小事项 1、在Java、C中,2 / 3 0,也就是整数 / 整数 整数,会把小数部分舍掉。而在python中2 / 3 0.66666.... 不会舍掉小数部分。 在编程语言中,浮点数遵循IEEE754标准,不…

[Linux]文件系统

[Linux]文件系统 文件系统是操作系统的一部分,负责组织、存储和管理存储在外部设备上的文件和目录,也就是操作系统管理外设中的文件的策略。本文讲解的是Ext2文件系统。Linux操作系统使用的就是Ext系列的文件系统。 文章目录 [Linux]文件系统了解磁盘结构…

【C++杂货铺】探索stack和queue的底层实现

文章目录 一、stack的介绍和使用1.1 stack的介绍1.2 stack的使用1.2.1 最小栈1.2.2 栈的压入、弹出序列1.2.3 逆波兰表达式求值1.2.4 用栈实现队列 二、queue的介绍和使用2.1 queue的介绍2.2 queue的使用2.2.1 二叉树的层序遍历 三、模拟实现3.1 stack模拟实现3.2 queue模拟实现…

Spine2D骨骼动画播放器 - 微信小程序版

Spine2D骨骼动画播放器 - 微信小程序版 简介平台支持 界面预览使用说明演示视频 版本笨笨的小目标(废话)参考资料测试文件百度盘分享 相关文档 简介 本播放器是SpinePlayer的微信小程序版。由于官方并没有提供现成的运行库,只能自己改造。 设…

Jobs Portal求职招聘系统源码v3.5版本

Jobs Portal求职招聘系统 是为求职者和公司发布职位而开发的交互式求职招聘源码。它使求职者能够发布简历、搜索工作、查看个人工作列表。 它将提供各种公司在网站上放置他们的职位空缺资料,并且还可以选择搜索候选人简历。 除此之外,还有一个管理模块供…