Modern OpenGL - GLSL着色语言3:GLSL中的数据类型
文章目录
- 1 GLSL的基本数据类型
- 2 GLSL的聚合类型:向量和矩阵
- 2.1 向量
- 2.1.1 向量初始化
- 2.1.1.1 向量初始化
- 2.1.1.2 向量构造函数的截短
- 2.1.1.3 向量构造函数的加长
- 2.1.2 向量元素的访问
- 2.1.2.1 使用分量名称进行访问
- 2.1.2.2 数组访问
- 2.1.3 向量的长度
- 2.2 矩阵
- 2.2.1 矩阵的维度
- 2.2.2 矩阵的初始化
- 2.2.2.1 初始矩阵为对角矩阵
- 2.2.2.2 指定矩阵每一个元素的值构建矩阵
- 2.2.3 矩阵元素的访问
- 2.2.4 矩阵的长度
- 3 数组
- 3.1 数组的声明
- 3.2 数组初始化
- 3.3 数组的长度
- 3.4 数组的遍历
- 4 结构体
- 4.1 结构体的声明
- 4.2 结构体初始化
1 GLSL的基本数据类型
GLSL中支持以下基本数据类型:
类型 | 描述 |
---|---|
float | 32位浮点值 |
double | 64位浮点值 |
int | 有符号32位整型 |
uint | 无符号32位整型 |
bool | 布尔值 |
2 GLSL的聚合类型:向量和矩阵
GLSL的基本类型可以进行合并,从而与核心OpenGL的数据类型相匹配以及可以简化计算过程。
GLSL支持2个、3个、4个分量的向量,每个分量都可以使用float、int、bool、uint、double等基本数据类型。除了向量之外,GLSL也支持float和doublel类型的矩阵。
基本类型 | 2D向量 | 3D向量 | 4D向量 | 矩阵类型 |
---|---|---|---|---|
float | vec2 | vec3 | vec4 | mat2 mat3 mat4 mat2x2 mat2x3 mat2x4 mat3x2 mat3x3 mat3x4 mat4x2 mat4x3 mat4x4 |
double | dvec2 | dvec3 | dvec4 | dmat2 dmat3 dmat4 dmat2x2 dmat2x3 dmat2x4 dmat3x2 dmat3x3 dmat3x4 dmat4x2 dmat4x3 dmat4x4 |
int | ivec2 | ivec3 | ivec4 | |
uint | uvec2 | uvec3 | uvec4 | |
bool | bvec2 | bvec3 | bvec4 |
2.1 向量
2.1.1 向量初始化
2.1.1.1 向量初始化
vec3 color = vec3(0.3,0.5,0.6);
而相同类型之间也可以进行等价转化:
vec3 color = vec3(0.3,0.5,0.6);
vec3 colorCopy = vec3(color);
2.1.1.2 向量构造函数的截短
向量的构造函数可以截短或者加长一个向量。比如一个较长向量传递给一个较短的向量的构造函数,那么向量会被自动截取到短向量的长度。
vec4 color = vec4(1.0,0.0,0.9,1.0);
vec3 color3 = vec3(color);
此时color3的值为:
(1.0,0.0,0.9)
2.1.1.3 向量构造函数的加长
我们也可以使用一个较短的向量加长得到较长的向量
vec3 color = vec3(1.0,0.0,0.2);
vec4 color4 = (color,1.0);
此时color4的值为:
(1.0,0.0,0.2,1.0)
2.1.2 向量元素的访问
向量元素的访问支持使用分量的名称和数组访问的形式。
2.1.2.1 使用分量名称进行访问
vec3 color = vec3(1.0,0.5,0.5);
float red = color.r;
float green = color.g;
float blue = color.b;
分量名称的组合共有三种形式,不同名称的集合只是为了在使用时便于区分不同的操作。
三种形式如下表:
符号描述 | 分量访问符 |
---|---|
与位置有关的分量 | (x,y,z,w) |
与颜色有关的分量 | (r,g,b,a) |
与纹理坐标有关的分量 | (s,t,p,q) |
需要注意的点:
- 在一条语句的一个变量中,只能使用一种类型的访问符,也就是说以下的代码是错误的。
vec4 color = colorCopy.rgz;
// z为位置有关的分量
- 使用分量访问元素时不能超出变量类型的范围
vec2 color;
float blue = color.b;
出错,因为是2维向量没有b分量。
- 反转分量
vec3 color = colorCopy.argb;
将透明分量a放在第一个元素值,然后是rgb
2.1.2.2 数组访问
vec3 color = vec3(1.0,0.5,0.5);
float red = color[0];
float green = color[1];
float blue = color[2];
2.1.3 向量的长度
向量的长度可以通过length()方法返回向量包含分量的个数。
2.2 矩阵
2.2.1 矩阵的维度
mat3x4,第一个数值代表列数,第二个数值代表行数,mat3x4表示这是一个3列4行的矩阵。
2.2.2 矩阵的初始化
2.2.2.1 初始矩阵为对角矩阵
mat3 tempMat = mat3(2.0);
此时:
tempMat=[2.00.00.00.02.00.00.00.02.0]tempMat=\begin{bmatrix}2.0&0.0&0.0\\0.0&2.0&0.0\\0.0&0.0&2.0\end{bmatrix} tempMat=⎣⎡2.00.00.00.02.00.00.00.02.0⎦⎤
2.2.2.2 指定矩阵每一个元素的值构建矩阵
传入的矩阵元素可以是标量和向量的集合,只需要将所有的元素值都填充。另外矩阵的指定需要遵循列主序的原则,传入的数据必须首先填充列然后再填充行,这一点与C语言中二维数组的初始化是相反的。
- 使用所有元素值初始化矩阵
mat3 M = mat3(1.0,2.0,3.0,
1.0,3.0,2.0,
0.0,2.0,1.0);
- 使用列向量初始化矩阵
方式1:
vec3 column1 = vec3(1.0,2.0,3.0);
vec3 column2 = vec3(1.0,3.0,2.0);
vec3 column3 = vec3(0.0,2.0,1.0);
mat3 M = mat3(column1,column2,column3);
方式2:
vec2 column1 = vec2(1.0,2.0);
vec2 column2 = vec2(1.0,3.0);
vec3 column3 = vec(0.0,2.0);
mat3 M = mat3(column1,3.0,
column2,2.0,
column3,1.0);
2.2.3 矩阵元素的访问
矩阵元素的访问可以使用数组标记的方式,直接从矩阵中得到一个标量值或者一组元素值。
- 获取元素标量值
float value = mat[1][1]; // 获取第一列第一行的元素值
- 获取一组元素值
vec3 vec = mat[2]; // 获取矩阵的第三列
2.2.4 矩阵的长度
矩阵的length()方法返回的是它包含列的个数。而行的个数可以通过列的长度length()方法进行返回。
mat3x3 mat;// 列数
int columeNum = mat.length();// 行数
int rowNum = mat[0].length(); //通过第1列的长度返回矩阵的行数
3 数组
3.1 数组的声明
GLSL还支持任意类型的数组,包括结构体数组。
和C语言相同,数组的所以可以通过方括号[]来完成。和C语言类似,一个大小为n的数组的元素范围为0到n-1。负数形式的数组索引值,或者超出范围的索引值都是不允许的。
数组可以定义为有大小的,或者没有大小的。我们可以使用没有大小的数组作为一个数组变量的前置声明,然后重新用一个合适的大小来声明它。数组形式的声明需要使用方括号[]。
例如下面两种声明的的作用是一样的:
float color[3];
float[3] color;
另外可以声明未定义维数的数组作为前置声明:
int length[];
3.2 数组初始化
float color[3]=float[3]{1.0,0.0,1.0};
其中构造函数的维数值可以不需要填。
3.3 数组的长度
我们可以使用length方法返回数组元素的个数,例如
int length = color.length();
3.4 数组的遍历
for(int i=0;i<color.length();++i)
{float value = color[i];
}
4 结构体
和C语言一样,可以使用结构体struct将不同数据类型的变量组合到一个结构体中。结构有利于组织自定义数据,并可以简化多组数据传入到函数的过程。
4.1 结构体的声明
struct MyStruct
{float red ;vec3 position;vec3 dir;
}
4.2 结构体初始化
vec3 positionValue = vec3(200.0,30.0,300.0);
vec3 dirValue = vec3(-1,1,0);
MyStruct tempStruct = MyStruct{20.0f,positionValue,dirValue};
如果大家有兴趣,可以访问我的个人站:http://www.stubbornhuang.com
Modern OpenGL - GLSL着色语言3:GLSL中的数据类型相关推荐
- GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。
Opengl红皮书有选择的看了一些,最后的讲着色语言GLSL的部分看的甚为不理解,然后找到Opengl橙皮书,然后就容易理解多了. 在前面,我们或多或少接触到Opengl的处理过程,只说前面一些处理, ...
- OpenGL ES着色语言-光照效果之散射光
OpenGL光照模型,在固定管线中,主要是调用OpenGL函数实现,如果使用着色器,该怎么实现.本文的例子是移植OpenGL 4.0 Shading Language Cookbook中第二章的例子. ...
- Modern OpenGL - GLSL着色语言2:GLSL入口函数和GLSL中的变量
文章目录 1 GLSL的入口函数和基本结构 2 GLSL中的变量声明 3 GLSL中变量的作用域 4 GLSL中变量的初始化 5 GLSL中变量的隐式转换 1 GLSL的入口函数和基本结构 对于很多编 ...
- OpenGL ES着色器语言之变量和数据类型
所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符.变量在声明的时候首先要标明类型,后边可以跟多个变量,之间用逗号隔开.很多情 ...
- OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)...
OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...
- OpenGL编译着色器
1.读入着色器的代码 一般着色器的代码可以写在raw下创建glsl文件. gls是openGL的着色语言. 1.1.顶点着色器 定义的每个单一的顶点,顶点着色器都会调用一次,当他被调用的时候,会在a_ ...
- 【Modern OpenGL】Shader
Shaders 正如在上一篇教程中提到的,shader是在GPU中运行的小程序.如上一个教程中实现的最简单的vertex shader和fragment shader,一个shader基本上负责图形渲 ...
- WebGL2.0从入门到精通-3、着色语言(1、数据类型及程序基本结构)
三.着色语言(Shader GLSL) 如何解读下面这个完整的顶点着色器程序呢?从着色语言开始讲起. 1 #version 300 es2 uniform mat4 uMVPMatrix; //总变换 ...
- OpenGL ES之着色语言GLSL的使用说明及API
EGL(Embedded Graphics Library) 一.概念说明 OpenGL ES 命令需要渲染上下文和绘制表面才能完成图形图像的绘制. 渲染上下文: 存储相关OpenGL ES 状态. ...
最新文章
- 线性代数---矩阵的各种问题求解方法
- Java最大公约数和最小公倍数的求法(辗转相除法)
- matlab中Cci,【指标量化】超买超卖——CCI 顺势指标
- 聊聊下一代监控:Prometheus
- tensorflow之数据加载
- 华为Ensp常用命令
- linux下安装ansys
- 高效工作的浏览器插件
- Ubuntu 14.04LTS下如何安装搜狗拼音输入法
- 重庆对口高职计算机类专业答案2020,2020年重庆市高职分类考试教育类专业招生试题及答案...
- LINQ 语句中Take() 和Skip() 总结
- 配置文件和日志文件导出方法
- 有关监控的前5名最佳书籍
- 《 Kubebuilder v2 使用指南 》-P6-CRD Admission Webhook
- 移动宽带套餐介绍_移动宽带一年多少钱 2018移动宽带套餐介绍
- English Learning - Day3 作业打卡 2022.12.9 周五
- transition和transition的区别
- SLAM学习资源免费分享-转载
- 京东数科智能巡检机器人亮相中国数据中心设施论坛大会
- 一份实用的seo整体优化方案
热门文章
- 人工智能和机器学习如何影响金融服务?
- python中functools_Python传说中的函数神器functools模块,为你全面解析
- locate用主动还是被动_科技、新能源太火了!想买主题基金,该买主动还是被动型基金?...
- 第一次跳槽,转战北京
- [Sgu395][bzoj2363]Binary Cat Club
- 女友说 Git 玩不明白,怎么办?安排。
- 引入swagger2 api接口文档并实现离线文档
- 2021年中国硫酸行业现状分析:表观需求量8313.36万吨,同比增长1.09%[图]
- 整理最全微信域名检测接口技术
- 对号入座,你是一个合格的程序员吗?