文章目录

  • 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.0​0.02.00.0​0.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中的数据类型相关推荐

  1. GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。

    Opengl红皮书有选择的看了一些,最后的讲着色语言GLSL的部分看的甚为不理解,然后找到Opengl橙皮书,然后就容易理解多了. 在前面,我们或多或少接触到Opengl的处理过程,只说前面一些处理, ...

  2. OpenGL ES着色语言-光照效果之散射光

    OpenGL光照模型,在固定管线中,主要是调用OpenGL函数实现,如果使用着色器,该怎么实现.本文的例子是移植OpenGL 4.0 Shading Language Cookbook中第二章的例子. ...

  3. Modern OpenGL - GLSL着色语言2:GLSL入口函数和GLSL中的变量

    文章目录 1 GLSL的入口函数和基本结构 2 GLSL中的变量声明 3 GLSL中变量的作用域 4 GLSL中变量的初始化 5 GLSL中变量的隐式转换 1 GLSL的入口函数和基本结构 对于很多编 ...

  4. OpenGL ES着色器语言之变量和数据类型

    所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符.变量在声明的时候首先要标明类型,后边可以跟多个变量,之间用逗号隔开.很多情 ...

  5. OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)...

    OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...

  6. OpenGL编译着色器

    1.读入着色器的代码 一般着色器的代码可以写在raw下创建glsl文件. gls是openGL的着色语言. 1.1.顶点着色器 定义的每个单一的顶点,顶点着色器都会调用一次,当他被调用的时候,会在a_ ...

  7. 【Modern OpenGL】Shader

    Shaders 正如在上一篇教程中提到的,shader是在GPU中运行的小程序.如上一个教程中实现的最简单的vertex shader和fragment shader,一个shader基本上负责图形渲 ...

  8. WebGL2.0从入门到精通-3、着色语言(1、数据类型及程序基本结构)

    三.着色语言(Shader GLSL) 如何解读下面这个完整的顶点着色器程序呢?从着色语言开始讲起. 1 #version 300 es2 uniform mat4 uMVPMatrix; //总变换 ...

  9. OpenGL ES之着色语言GLSL的使用说明及API

    EGL(Embedded Graphics Library) 一.概念说明 OpenGL ES 命令需要渲染上下文和绘制表面才能完成图形图像的绘制. 渲染上下文: 存储相关OpenGL ES 状态. ...

最新文章

  1. 线性代数---矩阵的各种问题求解方法
  2. Java最大公约数和最小公倍数的求法(辗转相除法)
  3. matlab中Cci,【指标量化】超买超卖——CCI 顺势指标
  4. 聊聊下一代监控:Prometheus
  5. tensorflow之数据加载
  6. 华为Ensp常用命令
  7. linux下安装ansys
  8. 高效工作的浏览器插件
  9. Ubuntu 14.04LTS下如何安装搜狗拼音输入法
  10. 重庆对口高职计算机类专业答案2020,2020年重庆市高职分类考试教育类专业招生试题及答案...
  11. LINQ 语句中Take() 和Skip() 总结
  12. 配置文件和日志文件导出方法
  13. 有关监控的前5名最佳书籍
  14. 《 Kubebuilder v2 使用指南 》-P6-CRD Admission Webhook
  15. 移动宽带套餐介绍_移动宽带一年多少钱 2018移动宽带套餐介绍
  16. English Learning - Day3 作业打卡 2022.12.9 周五
  17. transition和transition的区别
  18. SLAM学习资源免费分享-转载
  19. 京东数科智能巡检机器人亮相中国数据中心设施论坛大会
  20. 一份实用的seo整体优化方案

热门文章

  1. 人工智能和机器学习如何影响金融服务?
  2. python中functools_Python传说中的函数神器functools模块,为你全面解析
  3. locate用主动还是被动_科技、新能源太火了!想买主题基金,该买主动还是被动型基金?...
  4. 第一次跳槽,转战北京
  5. [Sgu395][bzoj2363]Binary Cat Club
  6. 女友说 Git 玩不明白,怎么办?安排。
  7. 引入swagger2 api接口文档并实现离线文档
  8. 2021年中国硫酸行业现状分析:表观需求量8313.36万吨,同比增长1.09%[图]
  9. 整理最全微信域名检测接口技术
  10. 对号入座,你是一个合格的程序员吗?