变量
GLSL的变量命名方式与C语言类似。变量的名称可以使用字母,数字以及下划线,但变量名不能以数字开头,还有变量名不能以gl_作为前缀,这个是GLSL保留的前缀,用于GLSL的内部变量。当然还有一些GLSL保留的名称是不能够作为变量的名称的。
基本类型
除了布尔型,整型,浮点型基本类型外,GLSL还引入了一些在着色器中经常用到的类型作为基本类型。这些基本类型都可以作为结构体内部的类型。如下表:
类型 | 描述 |
void | 跟C语言的void类似,表示空类型。作为函数的返回类型,表示这个函数不返回值。 |
bool | 布尔类型,可以是true 和false,以及可以产生布尔型的表达式。 |
int | 整型 代表至少包含16位的有符号的整数。可以是十进制的,十六进制的,八进制的。 |
float | 浮点型 |
bvec2 | 包含2个布尔成分的向量 |
bvec3 | 包含3个布尔成分的向量 |
bvec4 | 包含4个布尔成分的向量 |
ivec2 | 包含2个整型成分的向量 |
ivec3 | 包含3个整型成分的向量 |
ivec4 | 包含4个整型成分的向量 |
mat2 或者 mat2x2 | 2×2的浮点数矩阵类型 |
mat3或者mat3x3 | 3×3的浮点数矩阵类型 |
mat4x4 | 4×4的浮点矩阵 |
mat2x3 | 2列3行的浮点矩阵(OpenGL的矩阵是列主顺序的) |
mat2x4 | 2列4行的浮点矩阵 |
mat3x2 | 3列2行的浮点矩阵 |
mat3x4 | 3列4行的浮点矩阵 |
mat4x2 | 4列2行的浮点矩阵 |
mat4x3 | 4列3行的浮点矩阵 |
sampler1D | 用于内建的纹理函数中引用指定的1D纹理的句柄。只可以作为一致变量或者函数参数使用 |
sampler2D | 二维纹理句柄 |
sampler3D | 三维纹理句柄 |
samplerCube | cube map纹理句柄 |
sampler1DShadow | 一维深度纹理句柄 |
sampler2DShadow | 二维深度纹理句柄 |
结构体
结构体
结构体可以组合基本类型和数组来形成用户自定义的类型。在定义一个结构体的同时,你可以定义一个结构体实例。或者后面再定义。
struct surface {float indexOfRefraction; vec3 color;float turbulence; } mySurface; surface secondeSurface;
你可以通过=为结构体赋值,或者使用 ==,!=来判断两个结构体是否相等。
mySurface = secondSurface;
mySurface == secondSurface;
只有结构体中的每个成分都相等,那么这两个结构体才是相等的。访问结构体的内部成员使用. 来访问。
vec3 color = mySurface.color + secondSurface.color;
结构体至少包含一个成员。固定大小的数组也可以被包含在结构体中。GLSL的结构体不支持嵌套定义。只有预先声明的结构体可以嵌套其中。
struct myStruct { vec3 points[3]; //固定大小的数组是合法的 surface surf; //可以,之前已经定义了 struct velocity { //不合法float speed; vec3 direction; } velo; subSurface sub; //不合法,没有预先声明;};struct subSurface { int id; };
数组
GLSL中只