# 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變量用于圖像的加載,存儲和圖像函數中描述的原子功能`指定的圖像訪問。