## [基本类型](https://ihavenolimitations.xyz/qihangkong/glslang-spec/1704656)
> 定义:基本类型是由语言的某些关键字定义的类型
> OpenGl 着色语言中支持如下的基本类型:
**透明类型**
| 类型 | 含义 |
| :---: | :---: |
| void | 用于函数没有返回值 |
| bool | 条件类型,取值为 true 或者 false |
| int | 有符号的整型 |
| uint | 无符号整型 |
| float | 单精度浮点类型标量 |
| double | 双精度浮点类型标量 |
| vec2 | 二维单精度浮点向量 |
| vec3 | 三维单精度浮点向量 |
| vec4 | 四维单精度浮点向量 |
| dvec2 | 二维双精度浮点向量 |
| dvec3 | 三维双精度浮点向量 |
| dvec4 | 四维双精度浮点向量 |
| bvec2 | 二维布尔向量 |
| bvec3 | 三维布尔向量 |
| bvec4 | 四维布尔向量 |
| ivec2 | 二维有符号整型向量 |
| ivec3 | 三维有符号整型向量 |
| ivec4 | 四维有符号整型向量 |
| uvec2 | 二维无符号整型向量 |
| uvec3 | 三维无符号整型向量 |
| uvec4 | 四维无符号整型向量 |
| mat2 | 2x2 的单精度浮点矩阵 |
| mat3 | 3x3 的单精度浮点矩阵 |
| mat4 | 4x4 的单精度浮点矩阵 |
| mat2x2 | 2x2 的单精度浮点矩阵 |
| mat2x3 | 2x3 的单精度浮点矩阵 |
| mat2x4 | 2x4 的单精度浮点矩阵 |
| mat3x2 | 3x2 的单精度浮点矩阵 |
| mat3x3 | 3x3 的单精度浮点矩阵 |
| mat3x4 | 3x4 的单精度浮点矩阵 |
| mat4x2 | 4x2 的单精度浮点矩阵 |
| mat4x3 | 4x3 的单精度浮点矩阵 |
| mat4x4 | 4x4 的单精度浮点矩阵 |
| dmat2 | 2x2 的双精度浮点矩阵 |
| dmat3 | 3x3 的双精度浮点矩阵 |
| dmat4 | 4x4 的双精度浮点矩阵 |
| dmat2x2 | 2x2 的双精度浮点矩阵 |
| dmat2x3 | 2x3 的双精度浮点矩阵 |
| dmat2x4 | 2x4 的双精度浮点矩阵 |
| dmat3x2 | 3x2 的双精度浮点矩阵 |
| dmat3x3 | 3x3 的双精度浮点矩阵 |
| dmat3x4 | 3x4 的双精度浮点矩阵 |
| dmat4x2 | 4x2 的双精度浮点矩阵 |
| dmat4x3 | 4x3 的双精度浮点矩阵 |
| dmat4x4 | 4x4 的双精度浮点矩阵 |
> Note: 下表所说"访问纹理","sampler "不透明类型访问纹理,"image " 不透明类型访问图像,具有指定的类型。
## 修饰符
> 变量的声明可以使用如下的修饰符。
| 类型 | 含义 |
| :---: | :---: |
| const | 常量值必须在声明是初始化。它是只读的不可修改的。 |
| attribute | 表示只读的顶点数据,只用在顶点着色器中。数据来自当前的顶点状态或者顶点数组。它必须是全局范围声明的,不能再函数内部。一个attribute可以是浮点数类型的标量,向量,或者矩阵。不可以是数组或则结构体 |
| uniform | 一致变量。在着色器执行期间一致变量的值是不变的。与const常量不同的是,这个值在编译时期是未知的是由着色器外部初始化的。一致变量在顶点着色器和片段着色器之间是共享的。它也只能在全局范围进行声明。 |
| varying | 顶点着色器的输出。例如颜色或者纹理坐标,(插值后的数据)作为片段着色器的只读输入数据。必须是全局范围声明的全局变量。可以是浮点数类型的标量,向量,矩阵。不能是数组或者结构体。 |
| centorid varying | 在没有多重采样的情况下,与varying是一样的意思。在多重采样时,centorid varying在光栅化的图形内部进行求值而不是在片段中心的固定位置求值。 |
| invariant | (不变量)用于表示顶点着色器的输出和任何匹配片段着色器的输入,在不同的着色器中计算产生的值必须是一致的。所有的数据流和控制流,写入一个invariant变量的是一致的。编译器为了保证结果是完全一致的,需要放弃那些可能会导致不一致值的潜在的优化。除非必要,不要使用这个修饰符。在多通道渲染中避免z\-fighting可能会使用到。 |
| in | 用在函数的参数中,表示这个参数是输入的,在函数中改变这个值,并不会影响对调用的函数产生副作用。(相当于C语言的传值),这个是函数参数默认的修饰符 |
| out | 用在函数的参数中,表示该参数是输出参数,值是会改变的。 |
| inout | 用在函数的参数,表示这个参数即是输入参数也是输出参数。 |
## 内置变量
> 内置变量可以与固定函数功能进行交互。在使用前不需要声明。顶点着色器可用的内置变量如下表:
| 名称 | 类型 | 描述 |
|-------------------------|-------|------------------------------------------------|
| gl\_Color | vec4 | 输入属性\-表示顶点的主颜色 |
| gl\_SecondaryColor | vec4 | 输入属性\-表示顶点的辅助颜色 |
| gl\_Normal | vec3 | 输入属性\-表示顶点的法线值 |
| gl\_Vertex | vec4 | 输入属性\-表示物体空间的顶点位置 |
| gl\_MultiTexCoordn | vec4 | 输入属性\-表示顶点的第n个纹理的坐标 |
| gl\_FogCoord | float | 输入属性\-表示顶点的雾坐标 |
| gl\_Position | vec4 | 输出属性\-变换后的顶点的位置,用于后面的固定的裁剪等操作。所有的顶点着色器都必须写这个值。 |
| gl\_ClipVertex | vec4 | 输出坐标,用于用户裁剪平面的裁剪 |
| gl\_PointSize | float | 点的大小 |
| gl\_FrontColor | vec4 | 正面的主颜色的varying输出 |
| gl\_BackColor | vec4 | 背面主颜色的varying输出 |
| gl\_FrontSecondaryColor | vec4 | 正面的辅助颜色的varying输出 |
| gl\_BackSecondaryColor | vec4 | 背面的辅助颜色的varying输出 |
| gl\_TexCoord\[\] | vec4 | 纹理坐标的数组varying输出 |
| gl\_FogFragCoord | float | 雾坐标的varying输出 |
> 片段着色器的内置变量如下表:
| 名称 | 类型 | 描述 |
|--------------------|-------|----------------------------------------------------------------|
| gl\_Color | vec4 | 包含主颜色的插值只读输入 |
| gl\_SecondaryColor | vec4 | 包含辅助颜色的插值只读输入 |
| gl\_TexCoord\[\] | vec4 | 包含纹理坐标数组的插值只读输入 |
| gl\_FogFragCoord | float | 包含雾坐标的插值只读输入 |
| gl\_FragCoord | vec4 | 只读输入,窗口的x,y,z和1/w |
| gl\_FrontFacing | bool | 只读输入,如果是窗口正面图元的一部分,则这个值为true |
| gl\_PointCoord | vec2 | 点精灵的二维空间坐标范围在\(0\.0, 0\.0\)到\(1\.0, 1\.0\)之间,仅用于点图元和点精灵开启的情况下。 |
| gl\_FragData\[\] | vec4 | 使用glDrawBuffers输出的数据数组。不能与gl\_FragColor结合使用。 |
| gl\_FragColor | vec4 | 输出的颜色用于随后的像素操作 |
| gl\_FragDepth | float | 输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替 |