GLSL全程 以及类型解释

GLSL全程为OpenGL着色语言(OpenGL Shading Language),是一种类似C语言的编程语言,专门用于编写图形处理器(GPU)的着色器程序。它主要用于OpenGL和Vulkan这样的图形API中进行图形渲染

基本类型

标量
基本的非向量类型包括:

bool:条件类型,值可以是truefalse
int:有符号,二进制补码,32 位整数
uint:无符号 32 位整数
float:IEEE-754 单精度浮点数
double:IEEE-754 双精度浮点数
警告:GLSL 中整数和浮点数的具体大小和格式仅适用于 GLSL 1.30 及更高版本。GLSL 的较低版本可能不使用这些确切的规范。
向量
每种标量类型(包括布尔值)都具有 2、3 和 4 分量等效向量。下面的 n 位数字可以是 2、3 或 4:

BVECN:布尔向量
IVECN:有符号整数的向量
UVECN:无符号整数的向量
VECN:单精度浮点数的向量
DVECN:双精度浮点数的向量
向量值可以应用与标量值相同的数学运算符。这些都对每个组件执行组件操作。但是,为了使这些运算符在向量上工作,两个向量必须具有相同数量的分量。

Swizzling
您可以使用以下语法访问向量的组件:

vec4 someVec;
someVec.x + someVec.y;
这称为 swizzling。您可以使用 x、y、z 或 w,分别引用第一、第二、第三和第四分量。

它之所以有这个名字“swizzling”,是因为以下语法是完全有效的:

vec2 someVec;
vec4 otherVec = someVec.xyxx;
vec3 thirdVec = otherVec.zyy;
您可以使用最多 4 个字母的任意组合来创建该长度的向量(基本类型相同)。vec3 也是如此,这就是我们用它初始化 vec3 值的方式。最多 4 个字母的任意组合都是可以接受的,只要源向量实际上具有这些分量即可。例如,尝试访问 vec3 的“w”组件是编译时错误。otherVec.zyy

Swizzling 也适用于 l 值:

vec4 someVec;
someVec.wzyx = vec4(1.0, 2.0, 3.0, 4.0); // Reverses the order.
someVec.zx = vec2(3.0, 5.0); // Sets the 3rd component of someVec to 3.0 and the 1st component to 5.0
但是,当您使用 swizzle 作为设置组件值的一种方式时,不能两次使用相同的 swizzle 组件。所以 someVec.xx = vec2(4.0, 4.0); 是不允许的。

此外,还有 3 套 swizzle 面罩。您可以使用 xyzw、rgba(用于颜色)或 stpq(用于纹理坐标)。这三组没有实际区别;它们只是句法糖。不能在单个 swizzle 操作中组合不同集合的名称。因此,“.xrs”不是有效的 swizzle 掩码。

在 OpenGL 4.2 或 ARB_shading_language_420pack 中,标量也可以被摆动。他们显然只有一个源组件,但这样做是合法的:

float aFloat;
vec4 someVec = aFloat.xxxx;
矩阵
除了向量,还有矩阵类型。所有矩阵类型都是浮点型,可以是单精度的,也可以是双精度的。矩阵类型如下,其中 n 和 m 可以是数字 2、3 或 4:

matnxm:具有 n 列和 m 行的矩阵(例如:mat2x2、mat4x3)。请注意,这与数学中的惯例背道而驰!
matn:matnxn 的常用简写:具有 n 列和 n 行的方阵。
双精度矩阵(GL 4.0 及更高版本)可以使用 dmat 而不是 mat 声明(例如:dmat4x4)。

OpenGL 以列优先格式存储矩阵,也就是说,元素连续存储在列中。

Swizzling 不适用于矩阵。您可以改用数组语法访问矩阵的字段:

mat3 theMatrix;
theMatrix[1] = vec3(3.0, 3.0, 3.0); // Sets the second column to all 3.0s
theMatrix[2][0] = 16.0; // Sets the first entry of the third column to 16.0.
但是,第一个数组访问器的结果是一个向量,因此您可以将其旋转:

mat3 theMatrix;
theMatrix[1].yzx = vec3(3.0, 1.0, 2.0);
不透明类型
不透明类型表示着色器以某种方式引用的某些外部对象。不透明变量的“值”与常规类型不同;它们是引用真实数据的标记。因此,它们只能用作函数的参数。这些函数返回/修改实际引用的数据。

不透明类型的变量只能通过以下两种方式之一进行声明。它们可以在全局范围内声明为统一变量。此类变量可以是不透明类型的数组。它们可以声明为结构的成员,但如果是这样,则结构只能用于声明统一变量(或声明本身是统一变量的结构/数组的成员)。它们不能直接或间接地成为缓冲区支持的接口块或输入/输出变量的一部分。

不透明类型变量也可以声明为非限定函数参数。这允许您将不透明类型传递给用户定义的函数。

不透明类型不能是 l 值。非数组不透明类型只能传递给将此类型作为参数的函数;它们不能用作表达式的任何其他部分。数组的不透明类型可以使用数组索引和结构字段选择(对于 .length())。

采样器
主条目:采样器(GLSL)
纹理访问并不像从内存地址读取值那么简单。过滤和其他过程应用于纹理,纹理坐标的解释方式可以成为纹理访问操作的一部分。由于这些原因,纹理访问有些复杂。

采样器类型是不透明的 GLSL 类型,表示绑定到 OpenGL 上下文的纹理。有许多采样器类型,每种类型的纹理(2D、2D_ARRAY 等)都有一种。采样器只能访问正确类型的纹理。

图片
主条目:镜像加载存储
图像变量是指存储在纹理中的特定类型的图像。这些用于在着色器中任意加载/存储值。

原子计数器
主条目:原子计数器
原子变量表示 Buffer 对象中的内存位置,可以在该位置上进行原子操作。

隐式转换
某些值可以隐式转换为某些类型。这意味着不需要显式构造操作。

有符号整数可以隐式转换为无符号整数,但反之则不然。任何一种整数类型都可以转换为浮点数,而整数和浮点数可以转换为双精度。

如果向量和矩阵值包含的基本类型是隐式可转换的,则会隐式转换它们。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值