GLSL 标量,和 C 语言类似,着色语言中有许多内建的原生数据类型以及构建数据类型,如浮点型(float),布尔型(bool),有符号性(int),无符号性(uint),矩阵型(matrix)以及向量型(vec2,vec3等)等。总体来说,这些数据类型可以分为标量、向量、矩阵、采样器、结构体以及数组等几类。
标量也被称为 “无向量”,值只具有大小,不具有方向。标量之间的运算遵循简单的代数法则,如质量、密度、体积以及温度等都属于标量。着色语言支持的标量类型有 bool、int、uint、float,各自的用法如下:
- 布尔型 – bool
布尔型用来声明一个单独的布尔数,它的值只能为 true 或者 false。布尔类型的值一般由关系运算或者逻辑运算产生,基本用法如下所示:
bool b; //声明一个布尔类型的变量
- 有符号整型/无符号整型 – int/uint
整型分为无符号和有符号两种类型,在一般情况下声明的整型变量都是由符号的类型,用 int 表示。整型用来声明一个单独的整数,值可以为正数、负数及 0,而无符号整数则不能用来声明负数。
与 C 语言中的整型有所不同,在着色语言中的整数保证支持 32 位精度,开发时注意运算需要在正确的范围进行(着色语言中无符号整型的精度不含符号位,有符号整型的精度包含符号位),超出运算范围可能产生溢出问题。
着色语言中整数也可以像 C 语言中一样,用十进制,八进制或者十六进制等不同的进制来表示,基本用法如下所示:
int a = 15; // 十进制
uint b = 3u; // 无符号十进制
int c = 036; // 0 开头的字面量为八进制,代表十进制的30
int d = 0x3D; // 0x开头的字面常量为十六进制,代表十进制的61
声明无符号整型(uint)字面常量时,需要在数字之后添加后缀 u 或 U, 否则该字面常量的类型为有符号型。
- 浮点数 – float
浮点型用来声明一个单独的浮点数,浮点数常量可以用十进制形式和指数形式两种方式表示,基本用法如下:
float f; // 声明一个 float 型的变量
float g = 2.0; // 在声明变量的同时为变量赋初值
float h, i; // 同时声明多个变量
float j, k = 2.56, 1; // 声明多个变量时,可以为其中某些变量赋初值
float s = 3e2; // 声明变量,并赋予指数形式的初值,表示 3 乘以 10 的平凡
需要注意的是,由于着色语言没有采用 C/C++ 语言那样的方式来提供多种不同精度的浮点数,因此代码中的字面常量就不需要使用后缀来说明精度了。