🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 4.1 基本类型 定义:基本类型是由语言的某些关键字定义的类型 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*"不透明类型访问图像,具有指定的类型。 ``` 浮点不透明类型: | 类型 | 含义 | |-|-| | sampler1D <br>texture1D <br>image1D | 访问1D纹理的句柄 | | sampler1DShadow | 访问1D深度纹理的句柄 | | sampler1DArray <br>texture1DArray <br>image1DArray | 访问1D数组纹理的句柄 | | sampler1DArrayShadow | 访问1D深度纹理数组的句柄 | | sampler2D <br>texture2D <br>image2D | 访问2D纹理的句柄 | | sampler2DShadow | 访问2D深度纹理的句柄 | | sampler2DArray <br>texture2DArray <br>image2DArray | 访问2D数组纹理的句柄 | | sampler2DArrayShadow | 访问2D深度纹理数组的句柄 | | sampler2DMS <br>texture2DMS <br>image2DMS | 访问2D多重采样纹理的句柄 | | sampler2DMSArray <br>texture2DMSArray <br>image2DMSArray | 访问2D多重采样纹理数组的句柄 | | sampler2DRect <br>texture2DRect <br>image2DRect | 访问2D矩形纹理的句柄 | | sampler2DRectShadow | 通过比较访问矩形纹理的句柄 | | sampler3D <br>texture3D <br>image3D | 访问3D纹理的句柄 | | samplerCube <br>textureCube <br>imageCube | 访问立方体映射纹理的句柄 | | samplerCubeShadow | 通过比较访问立方体映射深度纹理的句柄 | | samplerCubeArray <br>textureCubeArray <br>imageCubeArray | 访问立方体映射数组纹理的句柄 | | samplerCubeArrayShadow | 通过比较访问立方体映射数组深度纹理的句柄 | | samplerBuffer <br>textureBuffer <br>imageBuffer | 用于访问缓冲区纹理的句柄 | | subpassinput | 用于访问浮点subpass输入的句柄 | | subpassInputMS | 用于访问多重采样浮点 subpass 输入的句柄 | 有符号整型的不透明类型: | 类型 | 含义 | |-|-| | isampler1D <br>itexture1D <br>iimage1D | 访问整型1D纹理的句柄 | | isampler1DArray <br>itexture1DArray <br>iimage1DArray | 访问整型1D数组纹理的句柄 | | isampler2D <br>itexture2D <br>iimage2D | 访问整型2D纹理的句柄 | | isampler2DArray <br>itexture2DArray <br>iimage2DArray | 访问整型2D数组纹理的句柄 | | isampler2DMS <br>itexture2DMS <br>iimage2DMS | 访问整型2D多重采样纹理的句柄 | | isampler2DMSArray <br>itexture2DMSArray <br>iimage2DMSArray | 访问整型2D多重采样纹理数组的句柄 | | isampler2DRect <br>itexture2DRect <br>iimage2DRect | 访问整型2D矩形纹理的句柄 | | isampler3D <br>itexture3D <br>iimage3D | 访问整型3D纹理的句柄 | | isamplerCube <br>itextureCube <br>iimageCube | 访问整型立方体映射纹理的句柄 | | isamplerCubeArray <br>itextureCubeArray <br>iimageCubeArray | 访问整型立方体映射数组纹理的句柄 | | isamplerBuffer <br>itextureBuffer <br>iimageBuffer | 用于访问整型缓冲区纹理的句柄 | | isubpassinput | 用于访问整型subpass输入的句柄 | | isubpassInputMS | 用于访问多重采样整型 subpass 输入的句柄 | 无符号整型的不透明类型: | 类型 | 含义 | |-|-| | isampler1D <br>itexture1D <br> iimage1D | 访问无符号整型1D纹理的句柄 | | isampler1DArray <br>itexture1DArray <br>iimage1DArray | 访问无符号整型1D数组纹理的句柄 | | isampler2D <br>itexture2D <br>iimage2D | 访问无符号整型2D纹理的句柄 | | isampler2DArray <br>itexture2DArray <br>iimage2DArray | 访问无符号整型2D数组纹理的句柄 | | isampler2DMS <br>itexture2DMS <br>iimage2DMS | 访问无符号整型2D多重采样纹理的句柄 | | isampler2DMSArray <br>itexture2DMSArray <br>iimage2DMSArray | 访问无符号整型2D多重采样纹理数组的句柄 | | isampler2DRect <br>itexture2DRect <br>iimage2DRect | 访问无符号整型2D矩形纹理的句柄 | | isampler3D <br>itexture3D <br>iimage3D | 访问无符号整型3D纹理的句柄 | | isamplerCube <br>itextureCube <br>iimageCube | 访问无符号整型立方体映射纹理的句柄 | | isamplerCubeArray <br>itextureCubeArray <br>iimageCubeArray | 访问无符号整型立方体映射数组纹理的句柄 | | isamplerBuffer <br>itextureBuffer <br>iimageBuffer | 用于访问无符号整型缓冲区纹理的句柄 | | atomic_uint | 用于访问无符号整数原子计数器的句柄 | | isubpassinput | 用于访问无符号整型subpass输入的句柄 | | isubpassInputMS | 用于访问无符号多重采样整型 subpass 输入的句柄 | 采样器不透明类型: | 类型 | 含义 | |-|-| | sampler | 访问描述如何采样一幅纹理的 状态 的句柄 | | samplerShadow | 访问描述如何采样一幅深度纹理的 状态 的句柄 | 此外,着色器可以使用数组和结构体聚合这些基本类型,以构建更复杂的类型。 没有指针类型。 本规范中,聚合表示使用结构体或者数组(Matrices和Vectors不是聚合的类型)。集合体,矩阵和向量将统称为复合体。 ## 4.1.1 Void 如果函数没有返回值,必须使用void声明。函数没有默认的返回类型。void关键字不能用于其他的声明中(空格式或者函数的实际参数除外),否则会产生编译时错误。 ## 4.1.2 Boolean 布尔 定义:布尔类型是指布尔标量和向量类型(bool,bvec2,bvec3,bvec4)。 为了使代码的条件执行更容易的表示,所以支持布尔类型,但是不期望硬件直接支持布尔类型的变量。真正的布尔类型仅仅保留意思为true或false中的一个值。GLSL中两个关键字true和false被用作布尔常量。声明布尔值,并可以选择初始化,如以下示例所示: ``` bool success; bool done = false; ``` 用于条件跳转的表达式(如果为for:?:,while,do-while)必须为bool类型。 ## 4.1.3 Integers ## 4.1.4 Floats ## 4.1.5 Vectors ## 4.1.6 Matrices, ## 4.1.7 Opaque Types 不透明类型 定义:不透明类型是语言隐藏的内部结构的类型。 如下小节列出的不透明类型,是声明对其他实际上不透明对象访问句柄的变量。这些对象通过内置函数访问,不能通过直接读或写声明的变量来实现。这些变量仅仅只能被声明为函数参数或者uniform修饰符的变量。唯一一个可以使用内存修饰符的不透明类型是image类型。除了使用数组索引、结构体成员选择、括号以外,不透明类型的变量不允许为表达式中的操作数,如果使用会导致编译时错误。 不透明变量不能被当作左值(l-value)。因此不能用作out或inout的函数参数,也不能被赋值。这些用法都会产生编译时错误。但是不透明变量可以通过in参数传递来匹配类型以及存储修饰符。并且不能使用初始化来声明。 因为单个不透明类型声明有效地声明了两个对象,不透明句柄本身以及句柄操作的对象,所以存储修饰符和内存修饰符都有空间。存储修饰符修饰不透明句柄本身,内存修饰符修饰句柄操作的对象。 * 纹理组合采样器 纹理组合采样器类型(如sampler2D)是[基本类型](xxx)表中描述的用于访问纹理的sampler类型(不包含sampler和samplerShadow)。对于不同的纹理目标,有不同的纹理组合采样器类型如float、integer、unsigned integer数据类型。纹理的访问通过内置纹理函数完成[纹理函数](xxx),`纹理组合采样用来指定要访问的纹理以及如何对其进行过滤`。 纹理组合的采样器类型是不透明类型,声明并具有上述不透明类型的行为。当在着色器中聚合到数组中时,只能使用动态Uniform的整数表达式对它们进行索引,否则结果会产生错误。 * Image 图像类型是不透明类型,如上面对不透明类型所述进行声明和表现。可以使用内存修饰符进一步修饰它们。当汇合到着色器中的数组时,只能使用动态Uniform的整数表达式对图像进行索引,否则结果将不确定。 Image变量可以操作1D、2D、3D图像,对应于一个绑定到图像单元的单独纹理图像的全部或者部分。对于不同的纹理目标有不同的图像类型如float、integer、unsigned integer。图像的访问必须使用与绑定到Image类型, 图像的访问必须使用与绑定到图像单元的纹理目标匹配的Image类型,或者对于3D/数组非分层绑定的图像应使用与图像层的尺寸匹配的图像类型(例如3D/2DArray/Cube/CubeArray的一层必须使用image2D,image1DArray的一层必须使用image1D,2DMSArray的一层必须使用image2DMS)。如果数据类型与图像不匹配,或者如果格式布局修饰符与图像单元类型不匹配,[OpenGL Specification](xxx)第8.25节"纹理图像的加载和存储",图像访问的结果是不确定的,但不能包括程序终止。 `Image变量用于图像的加载,存储和图像函数中描述的原子功能`指定的图像访问。